在我的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设置为当前域和端口?
谢谢!
答案 0 :(得分:7)
您可以使用环境变量或Rails初始化参数
config.action_controller.asset_host = ENV[ASSET_HOST].empty? ? 'http://' + Rails::Server.new.options[:Host] + ':' + Rails::Server.new.options[:Port] : ENV[ASSET_HOST]
这样,如果设置环境变量,则使用该地址,否则将使用默认值。
答案 1 :(得分:3)
此值在启动时可用,可能有所帮助:
Rails::Server.new.options[:Port]
尝试将其添加到development.rb文件的asset_host变量中。
答案 2 :(得分:1)
在Rails 4中,我们使用动态asset_host设置和proc:
# 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和任何其他设置的请求正常工作。
答案 3 :(得分: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