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

时间:2011-09-15 04:40:03

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

为了保持控制器特定的JavaScript逻辑不在标准application.js之内,只有相关控制器包含它,我将它放在自己的.js文件中并根据控制器名称包含它像这样的布局:

<%= javascript_include_tag "application", params[:controller] %>

这很好用,但是当我将应用程序部署到生产环境时(我正在使用Capistrano并设置了预编译任务),资产管道不会预编译任何特定于控制器的JS文件。我认为这是因为我的实际JavaScript文件没有被application.js中的require指令引用。

如何在不将特定于控制器的JS移回application.js或从application.js明确引用它的情况下处理此问题?

有没有办法告诉资产管道预编译其他列表文件?如何在生产中手动预编译特定文件?

更新

turns out,您可以在config/environments/production.rb

中指定单个文件
config.assets.precompile += %w( achievements.js )

...或者我只是继续前进,并为每个JavaScript文件任意添加它:

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

4 个答案:

答案 0 :(得分:7)

如果要预编译仅在assets / javascripts和assets / stylesheets目录的根目录中找到的js | css (而不是它们的树层次结构),可以将其放在环境文件中:< / p>

  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

答案 1 :(得分: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文件),但是在prod中,它们都将被包含在一个文件中。

仍然需要在你的配置中:

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

答案 2 :(得分:4)

这就是我的所作所为:

目录结构:

app/assets/javascripts/sessions/multiple.js
app/assets/application-sessions.js

application-sessions.js只有:

 *= require_self
 *= require_tree ./sessions

然后在你看来,做<​​/ p>

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

我的application_controller.rb方法中的FYI,@ current_controller = controller_name,使用before_filter调用。

答案 3 :(得分:0)

我在这里遇到同样的问题,对我来说很头疼。

包含* .js有点太多了,我不希望每个文件都被编译成单独的文件,其中一些假设要合并在一起。

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

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