Ответ 1
Вы должны иметь возможность вызвать url_helpers следующим образом:
Rails.application.routes.url_helpers.team_path(Team.first.id)
В моем приложении 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
.
Вы должны иметь возможность вызвать url_helpers следующим образом:
Rails.application.routes.url_helpers.team_path(Team.first.id)
Рассмотрите возможность решения как это предлагается в документах 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
чтобы добавить к предыдущему ответу, вы можете использовать Rails.application.routes.url_helpers
, просто добавьте в маршрут :as
, как в следующем примере:
get "sessions/destroy/:param_id", as: :logout
так что вы можете использовать его следующим образом:
Rails.application.routes.url_helpers.logout_path(:param_id => your_value)
Надеюсь, это поможет
Модели не должны иметь дело с вещами, такими как пути, перенаправления или любые другие вещи. Эти вещи являются чисто конструкциями вида или контроллера.
Модель действительно должна быть именно такой; модель того, что вы создаете. Он должен полностью описать эту вещь, позволить вам находить ее экземпляры, вносить в нее изменения, выполнять проверки на ней... Но у этой модели не было бы понятия о том, какой путь следует использовать ни для чего, даже для себя.
Обычно в мире Rails говорится, что если вам трудно что-то сделать (например, вызвать помощника пути из модели), вы делаете это неправильно. Это означает, что даже если что-то возможно, если это трудно сделать в Rails, это, вероятно, не лучший способ сделать это.