Rails 3嵌套布局:如何在最后添加?

时间:2012-02-25 07:31:04

标签: ruby-on-rails ruby layout

是否可以操作占位符以便我不仅可以设置其内容,还可以按特定顺序添加/删除内容?例如:

layouts / base.html.erb(基础布局意味着扩展):

<!DOCTYPE html>
<html>
    <head>
    <title><%= yield :title %></title>
    <%= yield :stylesheets %>
    <%= yield :javascripts %>
    <%= yield :csrf %>
    </head>
    <body>

    <div class='container-fluid'>
      <%= yield :header %>

      <%= content_for?(:content) ? yield(:content) : yield %>

      <%= yield :footer %>
    </div>
    </body>
</html>

layouts / application.html.erb(这是我将在我的应用程序的大部分内容中使用的布局,它继承自基本布局):

<% content_for :stylesheets do %>
  <%= stylesheet_link_tag    "application", :media => "all" %>
<% end %>

<% content_for :javascripts do %>
  <%= javascript_include_tag "application" %>
<% end %>

<% content_for :csrf do %>
  <%= csrf_meta_tags %>
<% end %>

<%= render :template => 'layouts/base' %>

现在我想要一个特定控制器的布局,可能需要添加更多的javascript链接,或者可能完全删除它们。假设我想在其他javascripts之后只添加一个文件。到目前为止我得到了这个:

layouts / some_controller.html.erb(这是特定控制器的布局,它应该从应用程序布局继承):

<% content_for :javascripts do %>
  <script src="/assets/some_javascript_that_depends_on_jquery.js" type="text/javascript"></script>
<% end %>

<%= render :template => 'layouts/application' %>

这不会起作用,因为它会在:javascripts占位符的开头放置some_javascript_that_depends_on_jquery.js,最后我需要它,因为它依赖于jquery。

必须直接扩展基本布局,并跟踪对应用程序布局所做的任何更改,以便将其应用于特定于控制器的布局。

处理这种情况的推荐方法是什么?

3 个答案:

答案 0 :(得分:0)

在application.html.erb中,将content_for:javascripts的内容保留在部分

这里你的部分将有     &lt;%= javascript_include_tag“application”%&gt;

然后,除了其他布局中的其他javascripts之外,再调用相同的部分。

另一种方式,

你可以调用一个有这样一个哈希的助手: js_files = {“application_controller”=&gt; [“js_file_1”],“some_controller”=&gt; [ “js_file_1”, “js_file_2”]}

现在,获取js文件并根据内容中的控制器在运行时构建javascript include标记。

希望这会更灵活。 抱歉没有格式化。

答案 1 :(得分:0)

每个控制器始终保留一个js文件。

<%= javascript_include_tag params[:controller] %>

让我们以users控制器为例,然后会有users.js.coffee个文件。

如果你想为用户控制器提供多个js文件,那么你可以在users.js.coffee文件中要求这些文件

  

vi users.js.coffee

//= require 'a'
//= require 'b'

/* my extra js code will go here */

答案 2 :(得分:0)

这不能像在其他框架中那样完成,只需扩展布局,然后随意修改继承的块。

Rails有点迫使你保持简单。