2011-09-06 11 views
13

私の生産はこのようになりますによる資産ホストの設定にPROD上の資産をコンパイルすることはできませんレール3.1は、コンフィグasset_host

私は資産に行く:プリコンパイル、私はこれを取得:

$ RAILS_ENV=production bundle exec rake assets:precompile 
rake aborted! 
This asset host cannot be computed without a request in scope. Remove 
the second argument to your asset_host Proc if you do not need the 
request. 

.... exce私は に必要なので、私は本当にリクエストがSSLであるかどうかを知っている第2引数を削除することはできませんPT。つまり、資産を生成するためのレーキタスク中に リクエストが存在しないことを理解しています。

このキャッチ22からどうやって抜けますか?

答えて

18

に発生します:

background:url(image_path('awesome-background.gif')) 

及び(2)あなたのasset_host第二引数を(必要とラムダは/ procに設定されていますrequest)。

引数はrequest引数を削除するか(実際に使用していない場合)、オプションにして(nilの場合は処理します)。これは、Ruby 1.9で簡単です(と簡単なはず、ノートを参照してください):

config.action_controller.asset_host = ->(source, request = nil, *_){ 
    # ... just be careful that request can be nil 
} 

あなたはルビー1.8と互換性を持つようにしたい場合は、デフォルト値を持つパラメータとPROC /ラムダを作成する直接的な方法はありませんが、あなたが使用することができます。

config.action_controller.asset_host = Proc.new do |*args| 
    source, request = args 
    # ... 
end 

それともメソッドを使用してください:

def MyApp.compute_asset_host(source, request = nil) 
    # ... 
end 

config.action_controller.asset_host = MyApp.method(:compute_asset_host) 

注:

  1. あなたのブロックは、「デフォルトホスト」、あなたは、プロトコルを指定する必要はありません理論的には"#{request.protocol}#{request.host_with_port}"
  2. を使用する必要はありませんを意味するnilを返すことができます。 //で始まるURLは、デフォルトのプロトコル(httpまたはhttps)を使用する必要があります。私はIE <= 8 will download the css assets twiceのように "should"と言っています。私はPDFkitの問題に遭遇しました。

だからあなたの特定のケースでは、あなたのasset_hostはのように簡略化することができます。

config.action_controller.asset_host = Proc.new { |source, request = nil, *_| 
    "//assets#{(source.length % 4) + 1}.example.com" if request && !request.ssl? 
} 

編集 bug feature of Rubyを避けるために、ラムダまたは他の*_を使用してください。ルビーは1.8.xの場合

+0

「リクエスト&& request.ssl?」を「リクエスト&& request.ssl」以外にしないでください。 –

+0

@EricKoslow:ああ、私は条件の一部を逆転しました。固定、私は考えます:-) –

+1

これは素晴らしい答えです、正しいとマークしてください! –

3

、@マーク・アンドレのmethod(:compute_asset_host)技術が私のために動作しませんでした。上記の方法を直接定義したとしても、NameError: undefined method `compute_asset_host' for class `Object'が発生しました。ここで

が私のために働いていたものです:

config.action_controller.asset_host = Proc.new do |*args| 
    source, request = args 
    if request.try(:ssl?) 
    'ssl.cdn.mysite.com' 
    else 
    'cdn%d.mysite.com' % (source.hash % 4) 
    end 
end 
+0

明示的なスコープで私の例を編集して、明確にしました。あなたの提案したProcは良いので、私も組み込んだ。ありがとう。 –