【问题标题】:Configure dynamic assets_host in Rails 3在 Rails 3 中配置动态 assets_host
【发布时间】:2012-03-30 17:06:24
【问题描述】:

我希望 Rails 3 根据当前域动态抓取资产:

mysite.com - assets.mysite.com mysite.ru - assets.mysite.ru

是否可以开箱即用?还是我应该手动实现?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    尝试向asset_host发送一个proc,这会产生资产路径和请求:

    config.action_controller.asset_host = proc {|path, request|
      "http://assets." << request.host
    }
    

    【讨论】:

    • 通过包含 http,您将页面限制为包含来自非 SSL/https 来源的资产。考虑到您的页面可能是 SSL,让 rails 添加适当的架构不是一个坏主意。
    【解决方案2】:

    请注意以下解决方案与其他解决方案的主要区别:

    1. 使用 request.domain 而不是 request.host,因为大多数资产主机不是 assets0.www.domain.com 而是 assets0.domain.com
    2. 使用 source.dash 和 modulo 将确保从同一个资产服务器提供同一个资产。这是页面性能的关键。
    3. 按资产类型/路径过滤。

    我一直都在做这样的事情:

      config.action_controller.asset_host = Proc.new { |source, request|
        "http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 3)}." << request.domain # cdn0-3.domain.com
      }
    

    或者,如果您有多个资产/cdn 主机,您可以决定选择从哪个主机提供什么样的资产,如下所示:

    config.action_controller.asset_host = Proc.new { |source, request|
      case source
      when /^\/images/
        "http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 2)}." << request.domain # cdn0-1.domain.com
      when /^\/javascripts/, /^\/stylesheets/
        "http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 2) + 2}." << request.domain # cdn2-3.domain.com
      else
        "http#{request.ssl? ? 's' : ''}://cdn4." << request.domain # cdn4.domain.com
      end
    }
    

    希望这会有所帮助!

    【讨论】:

    • 使用Zlib.crc32(source)而不是source.hash作为source.hash值在机器和进程之间不一致。
    【解决方案3】:

    你的意思是subdomains

    subdomains(tld_length = 1)
    
    Returns all the subdomains as an array, so ["dev", "www"] would be returned for “dev.www.rubyonrails.org“. You can specify a different tld_length, such as 2 to catch ["www"] instead of ["www", "rubyonrails"] in “www.rubyonrails.co.uk“.
    

    【讨论】:

      【解决方案4】:

      在 config/environments/production.rb 等中

      config.action_controller.asset_host = "http://assets." << request.host
      

      【讨论】:

      • 我们试过了,但是 rails 找不到请求对象。初始化时好像不存在
      • 当我在我的 development.rb 文件中使用它时,它显示为 ``method_missing': undefined method request' 我必须在文件顶部为此要求任何 pakage 吗?
      • 这不是正确的指定方式。您必须分配一个 Proc,或任何响应 call 实例方法的东西,该方法采用路径和请求。
      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2011-03-28
      • 2011-11-05
      相关资源
      最近更新 更多