【问题标题】:Is there a way to set set config.action_controller.asset_host in development有没有办法在开发中设置 set config.action_controller.asset_host
【发布时间】:2016-12-29 19:04:15
【问题描述】:

在我的 production.rb 中,我将asset_host 设置为 CloudFront,如下所示:

config.action_controller.asset_host = 'http://xxxxxxxx.cloudfront.net'

现在我发现在某些情况下(特别是输出要嵌入到另一个站点的 JavaScript)我也需要在开发环境中设置asset_host,默认的 null 不会削减它。理想情况下我想设置:

config.action_controller.asset_host = 'http://localhost:3000'

但是不能保证这个端口,我不愿意硬编码它。有没有办法将asset_host设置为当前域和端口?

谢谢!

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您可以使用环境变量或 Rails 初始化器参数

    config.action_controller.asset_host = ENV[ASSET_HOST].empty? ? 'http://' + Rails::Server.new.options[:Host] + ':' + Rails::Server.new.options[:Port] : ENV[ASSET_HOST]
    

    这样,如果您设置环境变量,则使用该地址,否则将使用默认地址。

    【讨论】:

    • Rails::Server.new.options 哈希是我正在寻找的答案。谢谢!
    • 这是一个有用的哈希值。
    【解决方案2】:

    在 Rails 4 中,我们使用带有 proc 的动态asset_host 设置:

    # in /config/environments/development.rb
    
    Rails.application.configure do
      config.action_controller.asset_host = Proc.new { |source, request|
        # source = "/assets/brands/stockholm_logo_horizontal.png"
        # request = A full-fledged ActionDispatch::Request instance
    
        # sometimes request is nil and everything breaks
        scheme = request.try(:scheme).presence || "http"
        host = request.try(:host).presence || "localhost:3000"
        port = request.try(:port).presence || nil
    
        ["#{scheme}://#{host}", port].reject(&:blank?).join(":")
      }
    
      # more config
    end
    

    此代码确保来自 localhost:3000、localhost:8080、127.0.0.1:3000、local.dev 和任何其他设置的请求正常工作。

    【讨论】:

    • 谢谢,这解决了我希望以相同配置同时支持 HTTP 和 HTTPS 开发环境的问题。
    【解决方案3】:

    此值在启动期间可用,可能会有所帮助:

    Rails::Server.new.options[:Port]
    

    尝试将它添加到你的 development.rb 文件的asset_host 变量中。

    基于此答案:https://stackoverflow.com/a/13839447/1882605

    【讨论】:

      【解决方案4】:

      试试:

      class ApplicationController < ActionController::Base
      before_filter :find_asset_host
      
      private
      
        def find_asset_host
          ActionController::Base.asset_host = Proc.new { |source|
              if Rails.env.development?
                "http://localhost:3000"
              else
                {}
              end
            }    
        end
      

      【讨论】:

      • 很酷,但仍然是硬编码的。从好的方面来说,我们可以在这个上下文中访问请求对象。
      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2011-07-11
      • 2010-09-17
      • 2010-10-14
      相关资源
      最近更新 更多