Как использовать метод помощника маршрута из файла в каталоге 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 с полным пути к модулю/классу, была выполнена.