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

Posted

技术标签:

【中文标题】如何为 Rails 中的 url 助手设置默认主机?【英文标题】:How do I set default host for url helpers in rails? 【发布时间】:2011-02-09 06:01:25 【问题描述】:

我想做这样的事情

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

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

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

【问题讨论】:

【参考方案1】:

asset_host 不适用于网址

您需要在 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

【讨论】:

或者你可以在你的 production.rb 中设置 #production.rb config.action_controller.default_url_options = host: 'myproduction.com' 你好,很抱歉重新打开它,但我有一个简单的问题:我们可以在 :host value 中放置多个地址吗? 关于它在 Rails 5 引擎中如何工作的任何更新? 设置config.action_controller.default_url_options = host: 'myproduction.com' 不是线程安全的。建议重写ApplicationContorller中的方法,即。【参考方案2】:

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

# 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'

【讨论】:

目前是Rails.application.default_url_options,没有.routes @MarcinAdamczyk 你的意思是在 Rails 4 中? 当然它在 Rails 4 中,我不记得 Rails 3 中有这个选项【参考方案3】:

另一种方法是这样设置

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

【讨论】:

我和@CHawk有同样的经历。【参考方案4】:

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

【讨论】:

【参考方案5】:

在 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

【讨论】:

【参考方案6】:

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

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

【讨论】:

这是个好主意,但至少在我的情况下它不起作用。我有带有 ServerName subdomain.example.com 的虚拟服务器,而 *_url 助手只使用 example.com。我还尝试查看环境变量,我将 HTTP_HOST 作为 subdomain.example.com,所以我很确定它是正确的。【参考方案7】:

NSD 的解决方案是我怎么做的,但我必须添加一个块才能使其与 https 一起使用:

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

【讨论】:

资产主机用于资产管道,而不是应用程序的路由。 谁是NSD,你把这段代码放在哪里?我假设它位于应用程序控制器或 /config/environments 中的环境特定文件之一中。由于这是一个旨在帮助人们解决问题的网站,因此清晰非常重要。 NSD 是评论者,他的帖子已被删除。【参考方案8】:

有这个,但我不太确定他们是否是您所指的助手:

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

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

【讨论】:

我的意思是api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html 中的助手,我已将此添加到我的问题中。 asset_host 处理资产管道的主机,而不是应用程序的路由。

以上是关于如何为 Rails 中的 url 助手设置默认主机?的主要内容,如果未能解决你的问题,请参考以下文章

如何为多记录 Rails 表单中的复选框设置唯一 ID?

如何为本地主机测试运行设置虚拟目录?

如何在 Webpacker 中使用 Rails Url 助手/Rails 5.1 中的 React-rails

Rails:如何为 redirect_to 设置 json 格式

导轨/Friendly_id。如何为旧的(丑陋的)URL 呈现 404 页面

如何为android中的APP设置默认权限值?