如何在Rails 3.1中显示控制器特定的JavaScript?

9
我有一个类似这样的资产文件夹结构。
assets
  javascripts
    products
      --product.js
      --productValidate.js
    store
      --store.js

当调用产品控制器中的操作时,我希望将project.js和projectValidate.js作为资产管道的一部分添加到我的application.js中;当调用商店控制器中的操作时,我希望将store.js添加到其中。在Rails 3.1中,如何实现这一点?

5个回答

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

所以你只需要在产品文件中添加/要求样式表和JavaScript文件。 注意,这里的所有代码都应该被视为伪代码,我没有测试过它。 来自"官方"渲染指南的信息。

这也是我使用的方法。但是我把JavaScript标签放在<html>标签前面。 - Victor
2
如果你想成为一个好的开发者,你应该在闭合的 </body> 标签之前放置 JavaScript 标签。 - Dmytrii Nagirniak

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 本身会被拆分成多个部分。
如果您需要支持特定用例,请提交问题,我保证会在有时间的时候努力实现它们 :)

1
据我所知,资产管道是应该预编译的东西。因此...从概念上讲,它应该一次性获取所有文件并返回一个已编译的文件,这对缓存非常有利。
您可以将它们存储在资产之外的某个地方(例如像旧版Rails一样存储在公共位置),并在依赖于当前控制器和操作的情况下进行包含。

1
我刚刚看了 Railscast 279,在其中 Ryan 提到可以使用 require_directory 而不是 require_tree 来指定要添加到 application.js 文件的文件夹。我想知道是否有类似的方法来添加特定于控制器的 js。 - Rahul
Ryan提到了你想要编译的文件夹,但它不在运行时 :) - fl00r

1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接