22

在 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,但这在动作邮件程序之外不起作用。

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

4

4 回答 4

38

这是我一直遇到的问题,并且困扰了我一段时间。

我知道很多人会说访问模型和模块中的 url_helpers 违背了 MVC 架构,但有时——例如与外部 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

结果!

于 2013-05-24T06:01:37.903 回答
17

安迪可爱的回答略有改进(至少对我来说)

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

于 2014-04-01T09:43:31.907 回答
6

在任何模块控制器中使用此字符串以使应用程序 URL-helpers 在任何视图或控制器中工作。

include Rails.application.routes.url_helpers

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

示例: 根应用程序

路线.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像在根应用程序中一样使用!

于 2016-02-13T18:57:58.133 回答
1

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

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

Rails.application.routes.default_url_options = ActionMailer::Base.default_url_options
于 2016-04-09T23:36:55.100 回答