困惑于高级Rails布局嵌套

时间:2010-11-17 19:36:12

标签: ruby-on-rails

我目前有一些应用程序使用的布局(...在所有布局之间是相同的):

# application.html.erb
...
<div id="section"><div class="wrapper"><%= yield %></div></div>
...

# wide.html.erb
...
<div id="section" class="wide"><div class="container-12"><%= yield %></div></div>
...

# thin.html.erb
...
<div id="section" class="thin"><div class="container-06"><%= yield %></div></div>
...

我希望重新考虑代码以减少重复,但是类变量的奇怪位置(在yield之外)会使其变得困难。我应该使用变量来声明布局中的类值(并移动到单个布局),还是应该添加包含重复container.html.erb的{​​{1}}布局,然后从中呈现其他三个布局(还是存在我缺少的另一个第三种选择)?如果可能的话,我正在寻找“Rails”方式。谢谢!

2 个答案:

答案 0 :(得分:3)

module ApplicationHelper
  def section_helper(outer_class=nil,inner_class)
    content_tag(:div, :class=> outer_class, :id => :section) do
      content_tag(:div, :class=> inner_class) do
        yield
      end
    end
  end
end

并在布局中:

<%= section_helper("wrapper") { yield } %>
<%= section_helper("wide","container-12") { yield } %>
<%= section_helper("thin","container-06") { yield } %>

这适用于没有“外部”类的第一种情况,因为:class => nil没有呈现任何内容。但是如果可选的第一个参数令人困惑,你也可以传入一个哈希值。

答案 1 :(得分:0)

我们使用像@sectionclass这样的实例变量做了类似的事情。然后我们将它设置为ApplicationController中的默认值,并将其翻转为在其他控制器中寻呼特定值。然后您的页面将是这样的:

<div id="section" class="<%= @sectionclass %>"><div class="container-12"><%= yield %></div></div>

实例变量的好处是nil case用空字符串静默失败。 (虽然有人可能会说这是'坏')。