【问题标题】:How to load different assets based on my layout?如何根据我的布局加载不同的资产?
【发布时间】:2016-01-24 12:33:23
【问题描述】:

我的网站的 3 个不同部分在 /views/layouts 中有 3 个布局。

我的资产如下所示:

/javascripts/layout1/*.js
/javascripts/layout2/*.js
/javascripts/layout3/*.js

/stylesheets/layout1/*.css
/stylesheets/layout2/*.css
/stylesheets/layout3/*.css

现在在一个特定的布局中,比如 layout1,我怎样才能只包含这个布局的样式/javascript 文件?

【问题讨论】:

  • 据我所知,您无法通过资产管道实现这一目标。您需要研究其他解决方案,例如 RequireJS

标签: ruby-on-rails asset-pipeline


【解决方案1】:

您可以通过以下五个步骤来实现这一目标

注意:我假设 layout1 layout2 和 layout3 是清单文件 比如 application.js 和 application.css

1) 为新布局创建清单文件

在 assets/javascripts/ 上创建以下 js 文件

layout1.js

//= require_tree ./layout1

layout2.js

//= require_tree ./layout2

layout3.js

//= require_tree ./layout3

在资产/样式表上创建以下 css 文件

layout1.css

/*  
*= require_tree ./layout1
*/

layout2.css

/*
*= require_tree ./layout1
*/

layout3.css

/*
 *= require_tree ./layout1
 */

2) 将此行添加到config/initializers/assets.rb

Rails.application.config.assets.precompile += %w( layout1.js layout1.css layout2.js layout2.css layout3.js layout3.css )

3) 在各个布局中包含以下行

layout1.html.erb

<%= stylesheet_link_tag    'layout1', media: 'all', 'data-turbolinks-track' => true %>

<%= javascript_include_tag 'layout1', 'data-turbolinks-track' => true %>

layout2.html.erb

<%= stylesheet_link_tag    'layout2', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'layout2', 'data-turbolinks-track' => true %>

layout3.html.erb

<%= stylesheet_link_tag    'layout3', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'layout3', 'data-turbolinks-track' => true %>

4) 在控制器中包含布局

layout_one_controller.rb

class LayoutOneController < ApplicationController
    layout 'layout1'
    def index
    end
end

layout_two_controller.rb

class LayoutTwoController < ApplicationController
    layout 'layout2'
    def indiex
    end
end

layout_three_controller.rb

class LayoutThreeController < ApplicationController
    layout 'layout3'
    def index
    end
end

5) 重新启动您的应用程序

【讨论】:

  • 如果你在实现这个过程中遇到任何困难,请告诉我
  • 澄清一下,我在资产中的布局文件夹会有很多文件。我更新了我的问题以表明这一点。
  • @Blankman,答案已更新,您只需按照此答案中第 1 点中的说明创建清单文件
【解决方案2】:

如果您想在您的应用中使用 layout1 资产,只需在您的布局中调用它:

#app/views/layout/layout_1.html.erb
<%= stylesheet_link_tag    :layout_1, media: 'all',  %>
<%= javascript_include_tag :layout_1 %>

--

正如@Ramesh Kumar Thiyagarajan 所述,您必须在assets.rb 初始化程序中包含任何额外的资产文件(application.css/.js 之外):

#config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( layout_1.js layout_1.css )

--

您还必须定义何时调用每个 layout

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
   layout :set_layout

   private

   def set_layout
      # conditional for determining layout
   end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2019-06-14
    相关资源
    最近更新 更多