我有一个行动
def new
@test_var = 'i want this to show'
end
我想做的就是将其注入(inject)到该页面调用的 javascript 中。例如:
#app/assets/javascript/my_model.js.coffee.erb
$ ->
console.log('<%= @test_var %>')
我猜这不起作用,因为在访问 Controller 之前 CoffeeScript /erb是编译的......所以,如果我想将 Controller 变量注入(inject)JavaScript文件(客户端 - 不通过ajax访问)在3.1中,我应该如何去做呢?
最佳答案
我认为问题在于您对 Assets 管道的思考完全错误...... Assets 是关键词。
这不是一个 View 管道。其他哪些东西是 Assets ?图像和 css 文件,可以预处理然后按原样提供的东西。 Assets 的 erb/预处理不会在每个页面加载/请求上发生,而是在启动/文件更改时发生,因此在生产中可以优化、缓存和静态提供 Assets 。
您可能会找到一种使用实时编译来实现它的方法(请参阅 http://guides.rubyonrails.org/asset_pipeline.html 的第 4.2 节),但正如文档所说:
This mode uses more memory and is lower performance than the default. It is not recommended.
糟糕的答案是“将 javascript 注入(inject)到您的 View 中”,但将 javascript 与 Rails Controller / View 解耦是一个好主意。
更好的答案是拥有一个包含所有 Controller JavaScript 的 Assets 文件夹,并使用一些“我在哪个页面?” 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?
关于ruby-on-rails-3.1 - 导轨3.1/sprockets : Injecting controller variables (or helpers) into javascript assets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7496190/