如何在rails 3.1中显示控制器特定的javascript?

我有我的资产文件夹结构

assets javascripts products --product.js --productValidate.js store --store.js 

我希望将project.js和projectValidate.js添加到我的application.js中,作为资产管道的一部分,仅当调用产品控制器中的操作时,并且当调用存储控制器中的操作时,调用store.js。 我怎样才能在rails 3.1中实现这一目标?

正如Rahul已经提到的,application.js是预编译的,并且对于每个动作都是相同的。 所以它不依赖于特定的控制器。 Application.js应包含您所有(或大部分)操作所需的JavaScript。

但是,您可以使用嵌套布局扩展应用程序布局。 让我们假设以下结构:

 ... app/view/layouts/application.html.erb ...   <%= javascript_include_tag 'application' %> <%= yield :javascripts %> <%= stylesheet_link_tag 'application' %> <%= yield :stylesheets %>   <%= yield %>   

和a:

 ... app/view/layouts/products.html.erb ... <% content_for :stylesheets do %> <%= stylesheet_include_tag 'products' %> <% end %> <% content_for :javascripts do %> <%= javascript_include_tag 'products' %> <% end %> <%= render :template => 'layouts/application' %> 

所以你只需要在产品文件中添加/要求你的样式表和javascripts。 请注意,这里的所有代码都应该作为伪代码读取,我没有测试它。

从“官方”渲染指南中获取的信息 。

据我所知,资产pipilene是应该预编译的东西。 所以……从概念上讲,它应该立即获取所有文件并返回一个已复制的文件,这对于缓存很有用。

您可以将它们存储在od资产的某个地方(例如,在旧版Rails中,将其存储在内)并根据当前控制器和操作将其包含在内

我喜欢这个问题的答案中提到的方法:

Rails 3.1资产管道:如何加载特定于控制器的脚本?

这就是我现在正在努力弥合Rails 3.1资产管道和Jammit之间的差距。

我还没有提供任何文件,因为我认为它正在开发中。 但这是它基本上应该允许你做的事情:

 # config/initializers/pakunok.rb # Define the dependencies between Rails assets: require 'pakunok' Pakunok::Pakunok.current.configure do asset('products/product.js').needs('products/productValidate.js') end 

然后,在您的布局中,您只需要执行一个包含 。 所有相关文件将自动包含在内

 # app/views/layouts/application.html.erb <%= include_javascripts %> 

请参阅规格以了解gem可以做什么。 注意:它仍在开发中 ,gem本身将在以后拆分成多个。

对于您希望获得支持的任何特定用例,请提交问题 ,我保证在我有时间的时候努力实施这些问题:)

rails文档以这种方式推荐: http : //guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets