2012-01-21 14 views
3

Herokuでのデプロイでは、application.rbにconfig.assets.initialize_on_precompile=falseが必要です。 Rails Guideから、これは "部分的にアプリケーションを読み込む"と言います。config.assets.initialize_on_precompileがfalseの場合の定数の設定

コンパイル済みのアセット(例:* .js.erb)で使用される定数を設定するのにベストプラクティスが何か疑問に思っていましたか?このフラグをfalseに設定すると、initailizerで設定されているものは使用できません。私は、アプリケーションのどの部分がロードされているか、コンパイルステップが実行される前にどのように定数、変数などを設定することができるかについては明確ではありません。

ありがとうございます!

答えて

0

私はアセットパイプラインを少し新しくしているので、ベストプラクティスについてはわかりません。しかし、念頭に置くべき解決策の1つは、アプリケーションの依存性であるレイクタスクを追加することです。私はタクが何をするかはかなり分かっていない。私が想像している実装はそれほどきれいではありません。

レイクタスクが* .js.erbファイルにコピーする* .js.erb.templateのようなテンプレートファイルを作成し、ファイル内容に何らかの種類のgsubを実行して、いくつかのプレースホルダを置き換える必要があるでしょう定数値。

うまくいけば他の誰かがより良い方法を持っている...

3

私は幸い、私は簡単にそれを修正することができました、似たような状況に遭遇しました。私はconfig.assets.initi....がherokuの文書が要求するようにherokuで実行されていることを知っていました。私はその前に手動でイニシャライザファイルを手動でロードしなければなりませんでした。私はちょうど1つの/config/initializers/settings.rbファイルを望んでいたので、そのためにrequireを追加しました。そしてそれが問題を解決しました。

... 
#at the end of the /config/application.rb file 
require Rails.root.join("config/initializers/settings") #this is not loaded automatically in the assets:precompile task, that's why we need this 
config.assets.initialize_on_precompile = false 
... 
+0

@ akanetのソリューションを好む理由は、あなたの意図が何であるかをより明白に示しているからです必要な場所からファイルを取得します。もちろん、複数のアセットファイルに同じ定数が必要な場合は、その懸念とDRYと保守性の目標とのバランスを取る必要があります。 –

1

ここで私は

somejavascriptfile.js.erbを考え出すことができクリーンなソリューションです:あなたが必要な定数は一つだけアセットファイルで使用されている場合は、私は、

<% 
    # get around no asset initialization in precompile 
    require Rails.root.join('config/initializers/facebook') 
%> 

console.log('<%= Facebook::APP_ID %>'); 

config/initializers/facebook.rb

module Facebook 
    CONFIG = YAML.load(File.open(Rails.root.join('config/facebook.yml')))[Rails.env] 
    APP_ID = CONFIG['app_id'] 
    SECRET = CONFIG['secret'] 
end 
関連する問題