Как получить доступ к URL помощнику из модуля rails - PullRequest
60 голосов
/ 20 мая 2011

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

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

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

Ответы [ 5 ]

112 голосов
/ 20 мая 2011

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

 include Rails.application.routes.url_helpers
27 голосов
/ 26 июля 2012

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

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

ссылка

25 голосов
/ 24 апреля 2014

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

Еще один пример с тестами Капибары

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
5 голосов
/ 16 сентября 2016

Я боролся с тонкостями, которые ожидает помощник от контроллера и стека по умолчанию (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, вы можете просто сделать несколько фиктивных методов.
3 голосов
/ 09 июня 2014
delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'

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

неопределенный метод `url_helper '

...