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

Как использовать 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, но это не работает вне почтовой программы действий.

Каков правильный способ установки хоста для нескольких сред?

4b9b3361

Ответ 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