Rails 3.1资产管道:如何加载特定于控制器的脚本?

Mik*_*evz 76 assets ruby-on-rails ruby-on-rails-3.1 sprockets asset-pipeline

如果我在Rails 3.1中生成一个新的控制器,也会自动添加一个带有控制器名称的javascript文件.首先,我认为这个javascript文件只会在调用相关控制器时使用.

默认情况下//= require_tree .,application.js-file中有指令,包括树上的每个javascript文件.

我怎么才能加载控制器特定的脚本?

Ngu*_*ong 122

要仅加载必要的name_of_the_js_file.js文件:

  1. 除去//=require_treeapplication.js

  2. 在资产管道中保留您的js文件(在加载特定页面时要加载)

  3. 添加帮助器 application_helper.rb

    def javascript(*files)
      content_for(:head) { javascript_include_tag(*files) }
    end
    
    Run Code Online (Sandbox Code Playgroud)
  4. 屈服于您的布局:

    <%= yield(:head) %>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在视图文件中添加:

    <% javascript 'name_of_the_js_file' %>
    
    Run Code Online (Sandbox Code Playgroud)

那应该没问题

  • 确保将`config/application.rb`添加到`config.assets.precompile + =%w(name_of_js_file.js)`这样的行中,否则你可能会像我一样得到预编译问题.另见http://jalada.co.uk/2012/01/23/adding-files-to-config-assets-precompile-in-rails-3-1.html (13认同)
  • 值得注意的是,这种方法在生产中很有效.例如,如果您查看生产中的源代码,您将看到单个控制器javascript文件获得适当的缓存破坏名称,就像主application.js文件一样:<script src ="/ assets/mycontroller-923cef714b82e7dec46117f9aab7fb2c.js"类型= "文本/ JavaScript的"> </ SCRIPT> (2认同)

alb*_*uer 83

一个优雅的解决方案是在javascript_include_tag中要求controller_name

请参阅http://apidock.com/rails/ActionController/Metal/controller_name/class

<%= javascript_include_tag "application", controller_name %>
Run Code Online (Sandbox Code Playgroud)

controller_name.js将被加载并且也在资产中,因此您可以从此处获取其他文件.

例如,渲染汽车#index将给出

<%= javascript_include_tag "application", "cars" %>
Run Code Online (Sandbox Code Playgroud)

cars.js可以包含的地方

//= require wheel
//= require tyre
Run Code Online (Sandbox Code Playgroud)

请享用 !

  • 如果你没有为每个`controller_name.js'提供一个文件,你可能会看到一些预编译问题和缓存未命中,特别是如果你没有明确预编译每一个. (11认同)

Le *_*Duy 28

我总是在布局文件中包含这个.它可以将你的js范围用于行动

<%= javascript_include_tag params[:controller] if AppName::Application.assets.find_asset("#{params[:controller]}.js") %>
<%= javascript_include_tag "#{params[:controller]}_#{params[:action]}"  if AppName::Application.assets.find_asset("#{params[:controller]}_#{params[:action]}.js") %>
Run Code Online (Sandbox Code Playgroud)

  • @kitsched - 您可能需要通过类似http://stackoverflow.com/a/18992685/94668的内容将所有资产添加到config.assets.precompile (3认同)

Rob*_*bin 6

您的问题可以通过不同方式解决.

动态添加资产

请注意,这不是生产模式的好解决方案,因为您的控制器细节不会被预编译!

  1. 向我们的应用程序助手添加以下方法:

    module ApplicationHelper
        def include_related_asset(asset)
        #          v-----{Change this}
            if !YourApp::Application.assets.find_asset(asset).nil?
                case asset.split('.')[-1]
                    when 'js'
                        javascript_include_tag asset
                    when 'css'
                        stylesheet_link_tag asset
                end
            end
        end
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. layout-file中调用helper方法:

    <%= include_related_asset(params[:controller].to_param + '_' + params[:action].to_param . 'js') %>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为控制器操作创建特定资产.E. g.controller_action.js

请不要忘记更改YourApp为您的应用程序的名称.

使用 yield

  1. 添加<%= yield :head%>到您的布局头
  2. 在操作视图中包含您的资源:

    <% content_for :head do %>
    <%= javascript_include_tag 'controller_action' %>
    <% end %>
    
    Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Rails指南.


归档时间:

查看次数:

36227 次

最近记录:

11 年,1 月 前