7

在我的 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设置为当前域和端口?

谢谢!

4

4 回答 4

8

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

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

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

于 2013-05-17T18:53:58.613 回答
3

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

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

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

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

于 2013-05-17T18:40:47.943 回答
3

在 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 和任何其他设置的请求正常工作。

于 2016-12-29T11:04:15.043 回答
0

尝试:

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
于 2013-05-17T19:08:55.523 回答