2012-01-21 3 views
3

Heroku에서 배포하려면 application.rb에 config.assets.initialize_on_precompile=false이 필요합니다. Rails Guide에서 "부분적으로 애플리케이션을로드합니다"라고 표시됩니다.config.assets.initialize_on_precompile이 거짓 일 때 상수 설정

그래서 컴파일 된 자산 (예 : * .js.erb)에 사용되는 몇 가지 상수를 설정하는 것이 가장 좋습니다. 이 플래그를 false로 설정하면 initailizers에 설정된 값을 사용할 수 없습니다. 나는 애플리케이션의 어떤 부분이 로딩되는지, 그리고 컴파일 단계가 수행되기 전에 어떻게 상수, 변수 등을 설정할 수 있는지에 대해 명확하지 않다.

감사합니다.

답변

0

저는 자산 파이프 라인에 다소 익숙하기 때문에 모범 사례는 확실하지 않습니다. 그러나 마음에 떠오르는 한 가지 해결책은 자산의 종속성 인 레이크 작업을 추가하는 것입니다 : 사전 컴파일. 나는 taks가 할 것 인 것이 아주 명확하지 않다. 내가 상상하는 구현은별로 예쁘지 않습니다.

레이크 작업이 * .js.erb 파일에 복사하는 * .js.erb.template과 같은 템플릿 파일을 만들고 파일 내용에 일종의 gsub을 수행하여 일부 자리 표시자를 상수 값.

희망의 다른 사람이 내가 비슷한 상황에 달렸다 더 나은 방법 ...

3

을 가지고, 다행히 나는 쉽게 할 수 수정이 있었다. 나는 heroku docs가 요청할 때 config.assets.initi....이 heroku에서 실행되고 있다는 것을 알았습니다. 그 전에 수동으로 이니셜 라이저 파일을 수동으로로드해야했습니다. 나는 단지 하나의 /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

I @ akanet의 해법을 선호하십시오. 왜냐하면 여러분의 의도가 무엇일까요? e 파일이 필요합니다. 물론 여러 개의 자산 파일에 동일한 상수가 필요한 경우 해당 우려와 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 
관련 문제