Как использовать метод помощника маршрута из файла в каталоге lib?

Мне нужно использовать метод root_url из метода, определенного в файле в папке lib. Возможно ли это?

Я попытался включить эту строку в свой класс:

include Rails.application.routes.url_helpers

но это дает мне ошибку

Отсутствует хост для ссылки! Укажите параметр хоста или установите default_url_options [: host]


Изменить: Я выяснил, что он работает, если я сначала инициализирую маршруты:

def initialize_routes
  if Rails.env.development? || Rails.env.test?
    Rails.application.routes.default_url_options[:host] = 'localhost:3000' 
  elsif Rails.env.production?
    Rails.application.routes.default_url_options[:host] = 'example.com'
  end
end

Есть ли лучший способ сделать это? Возможно, задание маршрутов в файле конфигурации?

Ответы

Ответ 1

Для этого должно быть несколько решений.

1) при использовании прохода root_url в параметре хоста, например:

root_url(:host => 'localhost')

Это должно быть сделано, чтобы быть специфичным для среды, хотя.

2) Вы также должны установить маршруты default_url_options, например:

Rails.application.routes.default_url_options[:host]= 'localhost:3000'

3) В конфигурационных файлах среды вы должны установить default_url_options, как указано в ошибке. Например:

В config/environments/development.rb:

config.action_mailer.default_url_options[:host] = 'localhost'

В config/environments/test.rb:

config.action_mailer.default_url_options[:host] = 'localhost'

В config/environments/production.rb:

config.action_mailer.default_url_options[:host] = 'production.com'

Ответ 2

Решение

@JDutil # 3, как упоминалось в комментариях, настраивает почтовую программу действий, а не маршруты маршрутизатора. Однако в конфигурации вы можете выполнить следующее:

В config/environments/development.rb и config/environments/test.rb:

MyApp::Application.configure do
  # other configuration ...
  config.after_initialize do
    Rails.application.routes.default_url_options[:host] = 'localhost:3000'
  end
end

Ответ 3

Если вы полагаетесь на url_helpers для чего-то вроде ActiveModel::Serializers (по крайней мере, серии v0.9. *), где вы будете генерировать URL-адреса вне основного потока запросов/ответов Rails, вы также будете необходимо установить Rails.application.routes.default_url_options. Я сделал это так,

# config/application.rb

config.after_initialize do
  Rails.application.routes.default_url_options = config.action_mailer.default_url_options
end

Теперь помощники URL-адресов доступны с хостом по умолчанию в таких местах, как фоновые задания и т.д.

Ответ 4

У меня была такая же проблема, и ни одна из предложений по настройке не работала. Вещь, которая оставила меня в замешательстве, заключается в том, что url_helpers отлично работает с другими частями приложения (в частности, с помощниками). Поэтому мне не нужно вставлять новую конфигурацию, чтобы использовать их в другом месте.

Мое решение в конце дня состояло в том, чтобы сделать это:

Rails.application.routes.url_helpers.athlete_url(athlete)

То, что я подозреваю, хотя я не могу доказать, заключается в том, что в том числе помощники URL-адресов вручную:

include Rails.application.routes.url_helpers

фактически вызывает выполнение блока included. Это меняет конфигурацию из-под кода, пытающегося его использовать. Не считая этого, но вместо этого ссылаясь на него, любые "включенные" блоки не выполняются повторно.

Мне бы хотелось узнать, может ли кто-нибудь объяснить, правильно ли я нахожусь на правильном пути или просто делать ложные предположения.

Нижняя строка, хотя, ссылаясь на url_helpers с полным пути к модулю/классу, была выполнена.