2012-07-10 44 views
0

我有以下小问题。多个content_for指定类

在布局我屈服于content_for设置一些课程在我身上的标签:

<body class="<%= yield(:body_classes) %> 

他们,我想打电话给content_for

<%= content_for(:body_classes, "one") %> 

到目前为止好。我用content_for第二次:

<%= content_for(:body_classes, "two") %> 

在我的HTML我得到如下:

<body class="onetwo"> 

是否有通过空间这两个类分开优雅的方式?我可以想到几个哈克解决方案,但没有什么感觉是正确的...

非常感谢!

回答

2

我不认为content_for是一个不错的选择在这种情况下。

def klass(*classes) 
    @classes = [] if @classes.nil? 
    @classes += classes 
    @classes.uniq! 
    nil 
end 

def has_klass?(klass) 
    [email protected]? && @classes.include?(klass) 
end 

def body_klasses 
    @classes.map(&:to_s).join(" ") rescue nil 
end 

使用模板:但是,您可以用几个辅助方法(从我的Rails项目之一中提取)完美地解决这个问题

<%= klass :one, :two %> 
<%= klass :three %> 

在布局,确定是否一定类设置:

<% if has_klass? :one %> 

最后...

<body class="<%= body_klasses %>"> 

您可以进一步自定义这些以更好地满足您的需求。

+0

看起来像我目前看到的最清洁的方式。 – alexs333 2012-07-18 23:54:07

+0

你可以通过用'>'...当没有设置klass时,将移除class =' – Abram 2015-11-04 02:18:39

0

每次您设置content_for时,只需在课程之前(或之后)放置空格。

<% content_for(:body_classes, "one ") %> 

顺便说一句,你可能不希望在您的设置标签=;您通常不希望Rails将以后存储的内容输出到HTML中。

0

也许您可以在将某些内容添加到body_clases之前检查它是否已经存在,以便在添加新内容之前添加空间。

<% content_for(:body_classes,content_for?(:body_classes) ? ' one' : 'one') %> 
<% content_for(:body_classes,content_for?(:body_classes) ? ' two' : 'two') %> 

最终的HTML是:

<body class="one two">