config.assets.initialize_on_precompile为false时设置常量

时间:2012-01-21 07:47:00

标签: ruby-on-rails ruby-on-rails-3.1 heroku asset-pipeline

在Heroku上部署需要application.rb中的config.assets.initialize_on_precompile=false。从Rails Guide它说这“部分加载你的应用程序”。

所以我想知道在编译资产中设置一些常量的最佳实践是什么(例如* .js.erb)?将此标志设置为false,我无法使用在initailizers中设置的任何内容。我不是很清楚应用程序的哪些部分被加载,以及如何在执行编译步骤之前设置任何常量,变量等。

谢谢!

3 个答案:

答案 0 :(得分:3)

我遇到了类似的情况,幸运的是我能够很容易地解决它。我知道config.assets.initi....正在heroku上执行,因为heroku docs要求它。我只需要在此之前手动加载我的初始化程序文件。我只想要一个/config/initializers/settings.rb文件,所以我添加了一个要求。这解决了这个问题。

...
#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
...

答案 1 :(得分: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

答案 2 :(得分:0)

我对资产管道有点新意,所以我不确定最佳做法。但是,我想到的一个解决方案是添加一个rake任务,它是资产的依赖项:预编译。我不太确定这些人会做什么。我想象的实现并不是很漂亮。

您可能必须创建模板文件,例如* .js.erb.template,您的rake任务将复制到* .js.erb文件并对文件内容执行某种gsub以使用常量替换某些占位符值。

希望别人有更好的方法......