2015-02-14 18 views
7

Trong ứng dụng đường ray của tôi, tôi có một mô hình nhóm. tập tin route.rb của tôi cho các đội như sau:đường dẫn trợ giúp đường dẫn không được nhận dạng trong mô hình

resources :teams 

Trong teams_controller.rb tôi nộp dòng team_path(Team.first.id) làm việc tuy nhiên helper team_path url không được công nhận trong mô hình team.rb. của tôi Tôi nhận được thông báo lỗi này:

undefined local variable or method `team_path' for # <Class:0x00000101705e98> 
from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-4.1.1/lib/active_record/dynamic_matchers.rb:26:in `method_missing' 

Tôi cần tìm cách để mô hình nhận dạng trợ giúp đường dẫn team_path.

+1

Tôi nghĩ rằng bạn phải tránh sử dụng những người giúp đỡ trong các mô hình của bạn. Người trợ giúp rất hữu ích trong các khung nhìn và các bộ điều khiển. Dù sao, thông báo lỗi là gì và chính xác thì bạn sẽ sử dụng trình trợ giúp như thế nào? –

+0

Chúng thường hữu ích trong các khung nhìn và bộ điều khiển nhưng đối với trường hợp cụ thể này, tôi cần trình trợ giúp đường dẫn trong mô hình của mình. Tôi nhận được lỗi này 'undefined local variable hoặc method' team_path 'cho # từ /usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-4.1.1/lib/active_record /dynamic_matchers.rb:26:in 'method_missing'' – user3266824

Trả lời

12

Bạn sẽ có thể gọi url_helpers theo cách này:

Rails.application.routes.url_helpers.team_path(Team.first.id) 
+2

Nó chắc chắn không phải là "Đường ray." –

+1

Hoàn toàn đúng đối với các mô hình chịu trách nhiệm về vị trí của riêng họ, tức là URL. Đôi khi đúng đối với các mô hình liên quan đến CMS như' Trang', 'Điều', v.v ... nhưng đối với bất kỳ mô hình nào có URL để biết điều đó. –

+0

Cảm ơn Eliot, tôi sẽ trì hoãn sự phán đoán tốt của bạn và chỉnh sửa câu trả lời của tôi cho phù hợp. – trosborn

-1

Mô hình không được coi là xử lý những thứ như đường dẫn, chuyển hướng hoặc bất kỳ nội dung nào trong số đó. Những thứ đó hoàn toàn là cấu trúc của khung cảnh hoặc bộ điều khiển.

Mô hình thực sự chỉ nên như vậy; một mô hình mà bạn đang tạo ra. Nó phải mô tả đầy đủ điều này, cho phép bạn tìm các trường hợp của nó, thay đổi nó, thực hiện các xác nhận trên nó ... Nhưng mô hình đó sẽ không có khái niệm về đường dẫn nào nên được sử dụng cho bất cứ điều gì, thậm chí chính nó.

Một câu nói phổ biến trong thế giới Rails là nếu bạn cảm thấy khó khăn để làm điều gì đó (như gọi đường dẫn trợ giúp từ mô hình) bạn đang làm sai. Thực hiện điều này để có nghĩa là ngay cả khi một cái gì đó là có thể, nếu nó là khó để làm trong Rails nó có thể không phải là cách tốt nhất để làm điều đó.

+1

Tôi đang cố gắng lưu trữ nhiều đường dẫn của các nhóm khác nhau trong một chuỗi json cùng với các thuộc tính khác của một nhóm và đưa chúng vào một chú giải công cụ khi một phần tử html nào đó đang được di chuột lên . Vì vậy, đây không phải là một tình huống chuyển hướng điển hình. Tôi đã thực hiện một phương thức trong mô hình tạo chuỗi json này với tất cả các thuộc tính của tôi. Liên kết là một cái gì đó tôi chỉ nghĩ đến và Im không chắc chắn làm thế nào tôi sẽ thực hiện logic này trong bộ điều khiển mà không đặt rất nhiều logic nặng trong bộ điều khiển là tốt. Nó làm cho ý nghĩa nhất để chỉ có được nó trong mô hình với tôi. – user3266824

+0

Tôi không hiểu các downvotes. Tôi mệt mỏi vì đường ray khuyến khích thực hành xấu. – Papipo

7

xem xét giải quyết này as suggested in the Rails API docs for ActionDispatch::Routing::UrlFor:

# This generates, among other things, the method <tt>users_path</tt>. By default, 
# this method is accessible from your controllers, views and mailers. If you need 
# to access this auto-generated method from other places (such as a model), then 
# you can do that by including Rails.application.routes.url_helpers in your class: 
# 
# class User < ActiveRecord::Base 
#  include Rails.application.routes.url_helpers 
# 
#  def base_uri 
#  user_path(self) 
#  end 
# end 
# 
# User.find(1).base_uri # => "https://stackoverflow.com/users/1" 

Trong trường hợp của mô hình Team từ câu hỏi, hãy thử này:

# app/models/team.rb 
class Team < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 

    def base_uri 
    team_path(self) 
    end 
end 

Đây là một kỹ thuật thay thế mà tôi thích vì nó bổ sung ít phương pháp hơn cho mô hình.

Tránh include và sử dụng url_helpers từ đối tượng routes thay vì:

class Team < ActiveRecord::Base 

    delegate :url_helpers, to: 'Rails.application.routes' 

    def base_uri 
    url_helpers.team_path(self) 
    end 
end 
Các vấn đề liên quan