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

Joo*_*uur 21 ruby-on-rails ruby-on-rails-3 asset-pipeline

为了使控制器特定的JavaScript逻辑不在标准范围内,application.js并且只有相关控制器包含它,我将它放在自己的.js文件中,并根据布局中的控制器名称包含它,如下所示:

<%= javascript_include_tag "application", params[:controller] %>
Run Code Online (Sandbox Code Playgroud)

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

如何在不将我的控制器特定JS移回application.js或从application.js显式引用它的情况下处理这个问题?

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

更新

因为它证明,您可以在这里指定单个文件config/environments/production.rb:

config.assets.precompile += %w( achievements.js )
Run Code Online (Sandbox Code Playgroud)

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

config.assets.precompile += %w( *.js )
Run Code Online (Sandbox Code Playgroud)

Ala*_*ois 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
Run Code Online (Sandbox Code Playgroud)


Rob*_*bin 5

我认为你和james_schorr并没有真正谈论同样的事情.您需要将application.js以外的文件添加到config.assets.precompile.如果我没弄错的话,他的答案更多的是你可以/应该采用的目录结构.

如果我想要控制器特定,我会这样做:

/assets
    /javascripts
        /users
            login.js
            profile.js
        /blogs
        /posts
        users.js
        blogs.js
        posts.js
Run Code Online (Sandbox Code Playgroud)

例如,users.js将是:

*= require_tree ./users
Run Code Online (Sandbox Code Playgroud)

这样,你可以保持井井有条(每个控制器有很多js文件),但是在prod中,它们都将被包含在一个文件中.

仍需要在您的配置中:

config.assets.precompile += %w( *.js )
Run Code Online (Sandbox Code Playgroud)


jsc*_*orr 4

这就是我所做的:

\n\n

目录结构:

\n\n
app/assets/javascripts/sessions/multiple.js\napp/assets/application-sessions.js\n
Run Code Online (Sandbox Code Playgroud)\n\n

application-sessions.js 只有:

\n\n
 *= require_self\n *= require_tree ./sessions\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么在你看来,做

\n\n
<% if @current_controller == \'whatever\' %>\n   <%= javascript_include_tag "application-sessions" %>\n <% else %>\n   \xe2\x80\xa6.\n <% end %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

仅供参考,@current_controller = 我的 application_controller.rb 方法中的controller_name,使用 before_filter 调用。

\n