如何在rails中为url helpers设置默认主机?

时间:2010-04-17 21:37:13

标签: ruby-on-rails url configuration

我想做这样的事情

config.default_host = 'www.subdomain.example.com'

在我的一些配置文件中,以便object_url助手(ActionView::Helpers::UrlHelper)生成以http://www.subdomain.example.com开头的链接

我试图搜索文档,但除了ActionMailer文档和http://api.rubyonrails.org/classes/Rails/Configuration.html之外我没有找到任何对我没用的内容,因为我不知道要看哪个文件。有没有描述Rails :: Initializer.config的整个结构的地方?

8 个答案:

答案 0 :(得分:52)

asset_host不适用于网址

您需要覆盖default_url_options中的ApplicationController(至少在Rails 3中)

http://edgeguides.rubyonrails.org/action_controller_overview.html#default-url-options

class ApplicationController < ActionController::Base
  def default_url_options
    if Rails.env.production?
      {:host => "myproduction.com"}
    else  
      {}
    end
  end
end

答案 1 :(得分:46)

在您的环境配置中定义默认主机:

# config/environments/staging.rb
MyApp::Application.configure do
  # ...
  Rails.application.routes.default_url_options[:host] = 'preview.mydomain.com'
  # ...
end

然后,您可以在应用中的任意位置创建网址:

Rails.application.routes.url_helpers.widgets_url()

或在您的课程中包含网址助手:

class MyLib
  include Rails.application.routes.url_helpers

  def make_a_url
    widgets_url
  end
end

如果您没有定义默认主机,则需要将其作为选项传递:

widgets_url host: (Rails.env.staging? ? 'preview.mydomain.com' : 'www.mydomain.com')

指定协议之类的东西也很有用:

widgets_url protocol: 'https'

答案 2 :(得分:28)

另一种方法是将其设置为

# config/production.rb
config.action_controller.default_url_options = { host: 'myproduction.com' }

答案 3 :(得分:3)

您可以轻松为每个url_helper设置:host或/和:only_path参数。   yours_url(params, :host => "http://example.com", :only_path => Rails.env.test?) 这样您就不会在环境中设置全局default_url_options,除非您需要。

答案 4 :(得分:0)

据我所知,*_url助手使用服务器配置的主机名。因此,例如,如果我的Apache安装在http://www.myapp.com/接受对此Rails应用程序的请求,那么Rails将使用该地址。这就是为什么开发环境中的*_url方法默认指向http://localhost:3000

上一个答案中建议的资源主机只会影响image_tagstylesheet_link_tagjavascript_link_tag帮助。

答案 5 :(得分:-4)

使用rails中的全局变量获取动态域网址的最简单方法。

class ApplicationController < ActionController::Base
  def base_url       
    $base_url = request.base_url
  end

end

在您的头文件<% base_url %>中调用此方法后,现在您可以在应用程序的任何位置访问您的域名网址。

答案 6 :(得分:-5)

NSD的解决方案是我如何做到这一点,但我必须添加一个块才能使其与https一起使用:

config.action_controller.asset_host = Proc.new { |source, request|
  (request ? request.protocol : 'http://') +  "www.subdomain.example.com"
}

答案 7 :(得分:-10)

就是这样,但我不是非常确定他们是否是你所指的助手:

ActionController::Base.asset_host = "assets.example.com"

http://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html