如何设置 Rails 中的 URL 助手的默认主机?

我想做这样的事情

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 的整个结构?

78309 次浏览

有这个,但我不太确定他们是不是你说的帮手:

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

Http://api.rubyonrails.org/classes/actionview/helpers/assettaghelper.html

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

在前一个答案中建议的资产主机将只影响 image_tagstylesheet_link_tagjavascript_link_tag辅助程序。

NSD 的解决方案是我如何做到这一点,但我必须添加一个块,使它与 https 的工作:

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

asset_host对 urls 不起作用

您需要在 ApplicationController中覆盖 default_url_options(至少在 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

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

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

然后你可以在你的应用程序的任何地方创建一个 URL:

Rails.application.routes.url_helpers.widgets_url()

或者在类中包含 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'

另一种方法是这样设置

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

您可以轻松地为每个 url _ helper 设置 :host或/和 :only_path参数。 Your _ url (params,: host = > “ http://example.com”,: only _ path = > Rails.env.test?) 这样,您就不需要在您的环境中设置全局 default _ url _ options,除非您希望如此。

在 Rails 6.1中(至少) ,应用程序范围的 default _ url _ options 可以设置如下:

# config/environments/development.rb
Rails.application.default_url_options = { host: 'localhost', port: 3000 }


Rails.application.configure do
# ...
end

见: https://github.com/rails/rails/issues/29992#issuecomment-761892658