9

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

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

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

4

5 回答 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>

和一个:

... 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。注意,这里所有的代码都应该是伪代码,我没有测试。

信息取自“官方”渲染指南

于 2011-09-05T22:12:42.863 回答
1

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

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

于 2011-09-06T01:16:05.310 回答
1

据我所知,资产 pipilene 是应该预编译的。所以......从概念上讲,它应该一次获取所有文件并只返回一个已编译的文件,并且它有利于缓存。

您可以将它们存储在 od 资产的某个地方(例如,在公共资源中,就像旧的 Rails 所做的那样)并根据当前控制器和操作将其包含在其中

于 2011-09-05T20:55:59.297 回答
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

然后,在你的布局中,你只需要做一个 include。所有依赖文件将自动包含在内

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

请查看规格以了解宝石的功能。注意:它仍在开发中,gem 本身将在以后拆分为多个。

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

于 2011-09-06T05:33:17.457 回答
0

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

于 2014-03-05T14:20:56.997 回答