【问题标题】:Rails 3.1 strategy for pre-compiling controller specific JS assets用于预编译控制器特定 JS 资产的 Rails 3.1 策略
【发布时间】:2011-11-17 13:30:46
【问题描述】:

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

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

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

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

有没有办法告诉资产管道预编译额外的列表文件?如何在生产环境中手动预编译特定文件?

更新

因为它是turns out,您可以在config/environments/production.rb 中指定单个文件:

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

...或者我只是任性地为每个 JavaScript 文件添加它:

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

【问题讨论】:

  • 这真的应该是自动的!
  • 这里值得注意的是,将 scss/coffee 文件添加到预编译列表将不起作用! (也不会抛出任何错误!)。您必须仅以 .js/css 扩展名命名。

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


【解决方案1】:

如果您想预编译 仅在 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

【讨论】:

    【解决方案2】:

    我在这里也遇到同样的问题,这让我很头疼。

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

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

    不知道好不好用,我试试看,反正可能有用的提示。

    【讨论】:

      【解决方案3】:

      我认为你和 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 )
      

      【讨论】:

        【解决方案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 %>
        

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

        【讨论】:

        • 这看起来像是一个解决方案,尽管比我最终在更新中所做的要复杂一些。我希望我的解决方案没有意外的副作用。
        • 我认为你的方式很好。我列出的那个将允许您根据代码的“区域”仅包含所需的 js 文件。这样一来,您就不会加载超出所需的内容。
        猜你喜欢
        • 2011-12-20
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 2011-11-30
        • 2011-09-28
        相关资源
        最近更新 更多