Как использовать url helpers в модулях lib и настроить хост для нескольких сред
В приложении Rails 3.2 мне нужно получить доступ к url_helpers в файле lib
. Я использую
Rails.application.routes.url_helpers.model_url(model)
но я получаю
ArgumentError (Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true):
Я нашел несколько вещей, написанных об этом, но ничего, что действительно объясняет, как решить это для нескольких сред.
то есть. Я предполагаю, что мне нужно добавить что-то в мои файлы development.rb и production.rb, но что?
Ближе всего я видел ответ, предлагаемый с помощью config.action_mailer.default_url_option
, но это не работает вне почтовой программы действий.
Каков правильный способ установки хоста для нескольких сред?
Ответы
Ответ 1
Это проблема, с которой я постоянно сталкиваюсь, и некоторое время искал меня.
Я знаю, что многие скажут, что это противоречит архитектуре MVC для доступа к url_helpers в моделях и модулях, но есть моменты, например, при взаимодействии с внешним API-интерфейсом, где это имеет смысл.
И теперь благодаря этому замечательному сообщению в блоге я нашел ответ!
#lib/routing.rb
module Routing
extend ActiveSupport::Concern
include Rails.application.routes.url_helpers
included do
def default_url_options
ActionMailer::Base.default_url_options
end
end
end
#lib/url_generator.rb
class UrlGenerator
include Routing
end
Теперь я могу вызывать следующее в любой модели, модуле, классе, консоли и т.д.
UrlGenerator.new.models_url
Результат!
Ответ 2
Небольшое улучшение (по крайней мере для меня) на замечательном ответе Энди
module UrlHelpers
extend ActiveSupport::Concern
class Base
include Rails.application.routes.url_helpers
def default_url_options
ActionMailer::Base.default_url_options
end
end
def url_helpers
@url_helpers ||= UrlHelpers::Base.new
end
def self.method_missing method, *args, &block
@url_helpers ||= UrlHelpers::Base.new
if @url_helpers.respond_to?(method)
@url_helpers.send(method, *args, &block)
else
super method, *args, &block
end
end
end
и способ, которым вы его используете:
include UrlHelpers
url_helpers.posts_url # returns https://blabla.com/posts
или просто
UrlHelpers.posts_url # returns https://blabla.com/posts
Спасибо, Энди! +1
Ответ 3
Используйте эту строку в любом контроллере модуля, чтобы получить URL-помощники URL-адреса приложения в любом представлении или контроллере.
include Rails.application.routes.url_helpers
Обратите внимание, что некоторые внутренние url-помощники модуля должны иметь имена.
Пример:
корневое приложение
routes.rb
Rails.application.routes.draw do
get 'action' => "contr#action", :as => 'welcome'
mount Eb::Core::Engine => "/" , :as => 'eb'
end
Помощники Url в модуле Eb:
users_path
Добавить include Rails.application.routes.url_helpers
в контроллер contr
Итак, после этого помощник должен
eb.users_path
Итак, внутри модуля Eb вы можете использовать welcome_path
так же, как в корневом приложении!
Ответ 4
Не уверен, что это работает в Rails 3.2, но в более поздних версиях настройка параметров URL-адресов по умолчанию для маршрутов может выполняться напрямую в экземпляре маршрутов.
Так, например, для установки тех же параметров, что и для ActionMailer:
Rails.application.routes.default_url_options = ActionMailer::Base.default_url_options