用于指定类的多个content_for

时间:2012-07-10 07:45:28

标签: ruby-on-rails ruby ruby-on-rails-3

我有以下小问题。

在布局中,我屈服于 content_for 在我的body标签上设置一些类:

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

他们我想打电话给 content_for

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

到目前为止一切顺利。我第二次使用 content_for

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

在我的HTML中,我得到以下内容:

<body class="onetwo">

有没有一种优雅的方法可以用空格分隔这两个类?我可以想到几个hacky解决方案,但没有什么感觉正确......

非常感谢!

3 个答案:

答案 0 :(得分:2)

我不认为content_for在这种情况下是合适的。但是,您可以使用几个辅助方法(从我的一个Rails项目中提取)优雅地解决问题:

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

def has_klass?(klass)
  !@classes.nil? && @classes.include?(klass)
end

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

模板中的用法:

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

在布局中,确定是否设置了某个类:

<% if has_klass? :one %>

最后......

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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">