Ответ 1
В вашем модуле просто выполните:
include Rails.application.routes.url_helpers
У меня есть модуль с функцией. Он находится в /lib/contact.rb:
module Contact
class << self
def run(current_user)
...
end
end
end
Я хочу получить доступ к помощникам URL-адресов, например 'users_path' внутри модуля. Как мне это сделать?
В вашем модуле просто выполните:
include Rails.application.routes.url_helpers
Делегирование url_helpers кажется намного лучше, чем включение всего модуля в вашу модель.
delegate :url_helpers, to: 'Rails.application.routes'
url_helpers.users_url => 'www.foo.com/users'
Вот как я делаю это в любом контексте без include
routes = Rails.application.routes.url_helpers
url = routes.some_path
Это работает в любом контексте. Если вы пытаетесь include
url_helpers - убедитесь, что вы делаете это в нужном месте, например. это работает
module Contact
class << self
include Rails.application.routes.url_helpers
end
end
и это не работает.
module Contact
include Rails.application.routes.url_helpers
class << self
end
end
Еще один пример тестов Capybara
feature 'bla-bla' do
include Rails.application.routes.url_helpers
path = some_path #unknown local variable some_path
end
и теперь правильный
include Rails.application.routes.url_helpers
feature 'bla-bla' do
path = some_path #this is ok
end
delegate :url_helpers, to: 'Rails.application.routes'
url_helpers.users_url => 'www.foo.com/users'
Augustin Riedinger, этот код делегирования должен ссылаться на url_helpers (множественное число), иначе вы получите
undefined метод `url_helper '
Я боролся с тонкостями, которые хелпер ожидает от контроллера и стека по умолчанию (default_url_options
и т.д.) и не хочет жестко кодировать хост.
Наши помощники URL-адресов предоставляются нашим элегантным модулем, конечно:
include Rails.application.routes.url_helpers
Но включите это как есть, и (1) помощник будет искать default_url_options
, а (2) не будет знать о хосте запроса и запросе.
Хост-часть поступает из экземпляра контроллера url_options
. Следовательно, я передаю контекст контроллера в мой прежний модуль, теперь класс:
class ApplicationController
def do_nifty_things
HasAccessToRoutes.new(self).render
end
end
class HasAccessToRoutes
include Rails.application.routes.url_helpers
delegate :default_url_options, :url_options, to: :@context
def initialize(context)
@context = context
end
def render
nifty_things_url
end
end
Может не соответствовать каждому случаю, но мне это было полезно при реализации своего рода настраиваемого средства визуализации.
В любом случае: