Rails 3.1 / Sprockets:将控制器变量(或助手)注入javascript资产

时间:2011-09-21 07:37:47

标签: ruby-on-rails-3.1 sprockets

我有一个

的动作
def new 
  @test_var = 'i want this to show'
end

我想要做的就是将其注入为该页面调用的javascript中。例如:

#app/assets/javascript/my_model.js.coffee.erb
$ ->
  console.log('<%= @test_var %>')

我猜这不起作用,因为在访问控制器之前编译了coffeescript / erb ...所以,如果我想将控制器变量注入JavaScript文件(客户端 - 不能通过ajax访问)在3.1中,我该怎么做呢?

1 个答案:

答案 0 :(得分:5)

我认为问题在于你正在考虑资产管道都错了......  资产是操作词。

这不是 view 管道。其他资产是什么?图像&amp; css文件,可以预处理然后按原样提供的东西。资产的erb /预处理不会发生在每个页面加载/请求上,而是发生在启动/文件更改中,因此在生产中,所述资产可以进行静态优化,缓存和服务。

您可能想出一种使用实时编译实现它的方法(参见http://guides.rubyonrails.org/asset_pipeline.html的第4.2节),但正如文档所说:

  

此模式使用更多内存,性能低于默认值。不建议这样做。

糟糕的答案是“将javascript注入到您的视图中”,但是将您的javascript与rails控制器/视图分离是一个好主意。

更好的答案是拥有一个包含所有控制器javascripts的资产文件夹,并使用一些“我在哪个页面?” javascript以确定是否运行代码。

以下是一些解释各种方法的答案:

Rails 3.1 asset pipeline: how to load controller-specific scripts?

Using Rails 3.1, where do you put your "page specific" javascript code?