【问题标题】:How to display controller specific javascript in rails 3.1?如何在 rails 3.1 中显示控制器特定的 javascript?
【发布时间】:2011-11-10 20:46:19
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    信息取自"official" Render-Guide

    【讨论】:

    • 这也是我用的。但我把javascript标签放在&lt;html&gt;标签之前。
    • 如果你想成为一个好公民,你应该把javascript标签放在结束&lt;/body&gt;标签之前。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      This is what I am working on 现在可以弥补 Rails 3.1 资产管道和 Jammit 之间的差距。

      我没有提供任何文档,因为我认为它正在开发中。 但是this is 它基本上应该允许你做什么:

      # 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
      

      然后,在您的布局中,您只需要一个包含。所有相关文件都将自动包含

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

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

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

      【讨论】:

        【解决方案4】:

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

        Rails 3.1 asset pipeline: how to load controller-specific scripts?

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 我刚刚看到 railscast 279,其中 Ryan 提到 v 可以通过在 sprockets 中使用 require_directory 而不是 require_tree 来指定 v 想要添加到 application.js 文件中的文件夹。我想知道是否有类似的方法可以添加特定于控制器的 js。
          • Ryan 提到您要编译的文件夹不在运行时:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-02
          • 1970-01-01
          • 2011-09-28
          • 1970-01-01
          • 1970-01-01
          • 2012-01-19
          相关资源
          最近更新 更多