Помощник пути rails, не распознанный в модели

В моем приложении rails у меня есть модель команд. Мой файл route.rb для команд выглядит следующим образом:

resources :teams

В файле teams_controller.rb строка team_path(Team.first.id) работает, однако помощник URL team_path не распознается в моей команде model.rb. Я получаю это сообщение об ошибке:

 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'

Мне нужно найти способ для модели распознать помощник пути team_path.

Ответ 1

Вы должны иметь возможность вызвать url_helpers следующим образом:

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

Ответ 2

Рассмотрите возможность решения как это предлагается в документах Rails API для 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 # => "/users/1"

В случае модели Team из вопроса попробуйте следующее:

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

  def base_uri
    team_path(self)
  end
end

Вот альтернативный метод, который я предпочитаю, поскольку он добавляет меньше моделей в модель.

Избегайте include и используйте url_helpers из объекта routes:

class Team < ActiveRecord::Base

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

  def base_uri
    url_helpers.team_path(self)
  end
end

Ответ 3

чтобы добавить к предыдущему ответу, вы можете использовать Rails.application.routes.url_helpers, просто добавьте в маршрут :as, как в следующем примере:

get "sessions/destroy/:param_id", as: :logout 

так что вы можете использовать его следующим образом:

Rails.application.routes.url_helpers.logout_path(:param_id => your_value)

Надеюсь, это поможет

Ответ 4

Модели не должны иметь дело с вещами, такими как пути, перенаправления или любые другие вещи. Эти вещи являются чисто конструкциями вида или контроллера.

Модель действительно должна быть именно такой; модель того, что вы создаете. Он должен полностью описать эту вещь, позволить вам находить ее экземпляры, вносить в нее изменения, выполнять проверки на ней... Но у этой модели не было бы понятия о том, какой путь следует использовать ни для чего, даже для себя.

Обычно в мире Rails говорится, что если вам трудно что-то сделать (например, вызвать помощника пути из модели), вы делаете это неправильно. Это означает, что даже если что-то возможно, если это трудно сделать в Rails, это, вероятно, не лучший способ сделать это.