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

时间:2011-09-05 20:25:48

标签: ruby-on-rails ruby-on-rails-3.1 asset-pipeline

我有像我这样的资产文件夹结构

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

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

5 个答案:

答案 0 :(得分:4)

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

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

... app/view/layouts/application.html.erb ...

<html>
<head>
  <%= javascript_include_tag 'application' %>
  <%= yield :javascripts %>
  <%= stylesheet_link_tag 'application' %>
  <%= yield :stylesheets %>
</head>
<body>
  <%= yield %>
</body>
</html>

和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。 注意,这里的所有代码都应该被读作伪代码,我没有测试它。

"official" Render-Guide获取的信息。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

This is what I am working on现在要弥合Rails 3.1资产管道和Jammit之间的差距。

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

# 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 %>

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

对于您希望获得支持的任何特定用例,请submit issues我保证在有空的时候努力实施这些用途:)

答案 4 :(得分:0)