如何在lib模块中使用url helpers,并为多个环境设置host

时间:2013-05-23 17:42:58

标签: ruby-on-rails

在Rails 3.2应用程序中,我需要访问lib文件中的url_helpers。我正在使用

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建议的答案,但这不会在动作邮件之外发挥作用。

为多个环境设置主机的正确方法是什么?

4 个答案:

答案 0 :(得分:37)

这是一个我一直遇到的问题,并且已经让我烦恼了一段时间。

我知道很多人会说它违反MVC架构来访问模型和模块中的url_helpers,但有时候 - 例如在与外部API接口时 - 它确实有意义。

现在感谢this great blog post我找到了答案!

#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

结果!

答案 1 :(得分:17)

对Andy的可爱答案略有改善(至少对我而言)

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

答案 2 :(得分:3)

在任何模块控制器中使用此字符串,以使应用程序URL帮助程序在任何视图或控制器中都能正常工作。

include Rails.application.routes.url_helpers

请注意,某些内部模块url-helpers应该是命名空间。

示例: 根申请

  

的routes.rb

Rails.application.routes.draw do
get 'action' =>  "contr#action", :as => 'welcome'
mount Eb::Core::Engine => "/" , :as => 'eb'
end

模块Eb中的Url助手:

users_path

在控制器include Rails.application.routes.url_helpers

中添加contr

所以那个助手应该是

eb.users_path

因此,在Eb模块中,您可以使用与根应用程序中相同的welcome_path

答案 3 :(得分:1)

不确定这是否适用于Rails 3.2,但在以后的版本中,路由的默认URL选项可以在路由实例上直接完成。

例如,设置与ActionMailer相同的选项:

setTimeout(display(string), 2000);