【问题标题】:How do I set default host for url helpers in rails?如何为 Rails 中的 url 助手设置默认主机?
【发布时间】: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 整个结构的地方?

【问题讨论】:

    标签: ruby-on-rails url configuration


    【解决方案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

        【讨论】:

        猜你喜欢
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        相关资源
        最近更新 更多