Подтвердить что ты не робот

Как получить доступ к помощнику URL из модуля rails

У меня есть модуль с функцией. Он находится в /lib/contact.rb:

module Contact
  class << self
    def run(current_user)
      ...
    end
  end
end

Я хочу получить доступ к помощникам URL-адресов, например 'users_path' внутри модуля. Как мне это сделать?

4b9b3361

Ответ 1

В вашем модуле просто выполните:

 include Rails.application.routes.url_helpers

Ответ 2

Делегирование url_helpers кажется намного лучше, чем включение всего модуля в вашу модель.

delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'

ссылка

Ответ 3

Вот как я делаю это в любом контексте без 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

Ответ 4

delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'

Augustin Riedinger, этот код делегирования должен ссылаться на url_helpers (множественное число), иначе вы получите

undefined метод `url_helper '

Ответ 5

Я боролся с тонкостями, которые хелпер ожидает от контроллера и стека по умолчанию (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

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

В любом случае:

  • Если вы хотите, чтобы доступ к параметрам URL-адреса по умолчанию был бесшовным или хост запроса, вам нужно передать контекст диспетчера/запроса в
  • Если вам нужен только путь, нет хоста, и вам не нужны параметры URL-адреса, вы можете просто сделать несколько фиктивных методов.