链轮中环境特定变量

问题描述:

我使用内置链轮功能的Rails 3.2编译静态资产。是否有可能编译与环境特定变量的JavaScript?链轮中环境特定变量

所以我想这样做

/assets/javascripts/myfile.js


//lots of code 
script.src = 
     ('https:' == document.location.protocol ? 'https://' : 'http://') + 
       'some.metrics.site/projects/<%=ENV_SPECIFIC_TOKEN%>.js'; 
    //lots of other code 

链轮使您可以将任意数量的预处理器的一个文件名。最后添加一个.erb,它将首先被解释为ERB,然后输出为JavaScript文件。

mv assets/javascripts/myfile.js assets/javascripts/myfile.js.erb

检查出JavaScript/CoffeeScript and ERB滑轨资产管道指南。

+0

谢谢,这是一个好主意,但这意味着文件将在每次请求时重新编译。我正在询问一次编译(每次部署,比方说) – katzmopolitan 2012-10-17 16:44:42

+0

重温这个,我以前的评论不是(完全)正确的。如果打开了部署时间预编译,那么它只会根据需要编译一次 – katzmopolitan 2013-11-03 19:58:57

+0

您应该始终[预编译资源](http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets)生产,并且您应该通过在production.rb中设置'config.assets.compile = false'完全关闭生产中的资产管道。 – 2013-11-03 22:08:21

此问题的任何更新?

使用.erb扩展名可解决问题,但无法预编译资产。

在我的情况下,我需要预编译我的临时环境的资产。当我做rake资产:预编译RAILS_ENV = staging,我可以看到在生成的js资产中我的环境变量没有定义,因此字符串插值会产生一个空字符串。

的问题是(我认为)环境变量定义在配置/ application.rb中,同时产生资产,不叫。

我认为创建Capistrano可能会帮助您在生成资产前添加一些任务,但是如果我们可以在生成资产的同时定义一些环境变量(例如在CLI中),则会更好。

+0

如果你更新你的application.rb有 '''config.assets.initialize_on_precompile = true''' 这应该可以解决问题。 http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets – katzmopolitan 2013-11-03 19:56:02

+0

不幸的是,因为我使用Heroku的,它需要这个是假的,我不能这样做初始化函数,然后预编译资产。 – Mahdi 2013-11-04 06:48:07

+0

我解决了这个通过添加rake任务,我先打电话环境: – Mahdi 2013-11-04 07:03:14