Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 链轮中特定于环境的变量_Ruby On Rails 3_Sprockets - Fatal编程技术网

Ruby on rails 3 链轮中特定于环境的变量

Ruby on rails 3 链轮中特定于环境的变量,ruby-on-rails-3,sprockets,Ruby On Rails 3,Sprockets,我正在使用Rails3.2内置的链轮功能来编译静态资产。是否可以使用特定于环境的变量编译javascript 所以我想做一些像这样的事情 /assets/javascripts/myfile.js //大量的代码 script.src= ('https:'==document.location.protocol?'https://':'http://')+ 'some.metrics.site/projects/.js'; //许多其他代码 链轮允许将任意数量的预处理器附加到文件名。在末尾添加

我正在使用Rails3.2内置的链轮功能来编译静态资产。是否可以使用特定于环境的变量编译javascript

所以我想做一些像这样的事情

/assets/javascripts/myfile.js


//大量的代码
script.src=
('https:'==document.location.protocol?'https://':'http://')+
'some.metrics.site/projects/.js';
//许多其他代码

链轮允许将任意数量的预处理器附加到文件名。在末尾添加一个
.erb
,它将首先被解释为erb,然后作为JavaScript文件输出

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


查看上的Rails资产管道指南。

此问题有任何更新吗

使用.erb扩展可以解决问题,但在预编译资产时却不能

在我的例子中,我需要为我的登台环境预编译资产。当我执行rake assets:precompile RAILS_ENV=staging时,我可以在生成的js assets中看到没有定义我的环境变量,因此字符串插值会导致一个空字符串

问题是(我认为)环境变量定义在config/application.rb中,在生成资产时没有调用它


我认为gem Capistrano可以通过在生成资产之前添加一些任务来帮助我们,但是如果我们可以在生成资产时定义一些环境变量(例如在CLI中),那就更好了。

谢谢,这是一个好主意,但这意味着在每次请求时都会重新编译文件。我问的是一次编译(比如说每次部署),当我再次访问时,我之前的评论(完全)不正确。如果启用了deploy time pre compile(部署时预编译),那么它只会编译一次,这是您在生产中应该始终做到的,您应该通过在production.rb中设置
config.assets.compile=false
来完全关闭生产中的资产管道。如果您将application.rb更新为
config.assets.initialize\u on\u precompile=true
,应该可以解决这个问题。不幸的是,我不能这样做,因为我使用了heroku,而且它需要这个错:我通过添加一个rake任务解决了这个问题,我首先调用环境初始化函数,然后预编译资产。添加rails_12系数gem 2。设置用户环境编译变量
 //lots of code
 script.src =
        ('https:' == document.location.protocol ? 'https://' : 'http://') +
                'some.metrics.site/projects/<%=ENV_SPECIFIC_TOKEN%>.js';
  //lots of other code