0

我有以下小问题。

在布局中,我让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 解决方案,但感觉不对...

非常感谢!

4

3 回答 3

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 %>">

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

于 2012-07-10T19:05:13.217 回答
0

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

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

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

于 2012-07-10T07:53:27.817 回答
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">
于 2012-07-10T09:34:01.770 回答