Rails 3.1的控制器特定JS资产预编译策略

21

为了将控制器特定的JavaScript逻辑从标准的application.js中分离出来,并仅在相关控制器中包含它,我将其放入自己的.js文件中,并根据布局中的控制器名称进行包含,如下所示:

<%= javascript_include_tag "application", params[:controller] %>
那样做完全没有问题,但是当我将应用部署到生产环境时(我正在使用Capistrano,并设置了一个预编译任务),资产管道不会预编译任何控制器特定的JS文件。我猜这是因为我的实际JavaScript文件没有被application.js中的require指令引用。
在不将我的控制器特定的JS文件移回application.js或显式地从application.js引用它的情况下,我该如何处理这个问题?
是否有一种方法可以告诉资产管道预编译额外的文件列表?我如何在生产环境中手动预编译特定的文件?
更新
所述,您可以在config/environments/production.rb中指定单个文件:
config.assets.precompile += %w( achievements.js )

...或者我就随意地为每个JavaScript文件都添加了它:

config.assets.precompile += %w( *.js )

2
这应该是自动的! - James Lim
3
值得注意的是,在预编译列表中添加scss/coffee文件将不起作用!(也不会抛出任何错误!)。您必须仅使用.js/css扩展名命名。 - Peter Ehrlich
4个回答

7

如果您想预编译仅在assets/javascripts和assets/stylesheets目录根目录下找到的js | css文件(而不是它们的树形结构),您可以将以下内容放入环境文件:

  Dir.chdir "#{Rails.root}/app/assets/javascripts"
  a = Dir.glob("*.{js,coffee,erb}")
  Dir.chdir "#{Rails.root}/app/assets/stylesheets"
  b = Dir.glob("*.{css,erb}")
  config.assets.precompile +=  a.concat(b)
  Dir.chdir Rails.root

5
我认为你和james_schorr并没有真正谈论相同的事情。 除了application.js文件之外,您需要将其他文件添加到config.assets.precompile中。如果我没有理解错,他的答案更多地是关于您可以/应该采用的目录结构。

如果我想要专门针对控制器,我会这样做:

/assets
    /javascripts
        /users
            login.js
            profile.js
        /blogs
        /posts
        users.js
        blogs.js
        posts.js

例如,users.js 将是这样的:
*= require_tree ./users

这样,您可以保持组织性(每个控制器有许多js文件),但在生产环境中,它们将全部包含在一个文件中。

在您的配置中仍需要这样设置:

config.assets.precompile += %w( *.js )

4
这是我所做的事情:
目录结构:
app/assets/javascripts/sessions/multiple.js
app/assets/application-sessions.js

application-sessions.js只有以下内容:

 *= require_self
 *= require_tree ./sessions

那么在您的看法中,

<% if @current_controller == 'whatever' %>
   <%= javascript_include_tag "application-sessions" %>
 <% else %>
   ….
 <% end %>

提供信息:在我的application_controller.rb方法中,使用before_filter调用@current_controller = controller_name。


那看起来像是一个解决方案,虽然比我在更新中所做的要复杂一些。我希望我的解决方案没有意外的副作用。 - Joost Schuur
我认为你的方法很好。我列出的方法将允许您根据代码的“区域”仅包含所需的js文件。这样,您就不会加载多余的内容。 - jschorr

0

我在这里遇到了同样的问题,这对我来说是一个头疼的问题。

包括*.js文件有点过多,我不想将每个文件编译成单独的文件,其中一些应该合并在一起。

我的想法是,将控制器特定的文件存储到子目录中,例如“controllers”,然后仅包括controllers/*.js或css文件进行预编译。

不确定它是否有效,我会尝试一下,无论如何,这可能是一个有用的提示。


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