在我构建的每个webapp中,我遇到了这个问题。我想有条件地在HTML元素上设置类。例如,有时帖子的<div>
如下:
<div class="post">...</div>
有时它看起来像这样:
<div class="post even recent replied_to author_is_admin">...</div>
post
之后的每个班级都在那里因为某些逻辑决定它应该是。最好的方法是什么?在Rails + HAML中,我一直犯下这样的错误:
-classes = []
-classes << cycle('even', 'odd')
-classes << 'recent' if post.recent?
-classes << 'replied_to' if post.replied_to?
-classes << 'author_is_admin' if post.author_is_admin?
.post{:class => classes.join(' ')}
...
它不漂亮,我已缩短它以使用帮助器,所以我可以这样做:
.post{:class => "#{cycle('even', 'odd')} #{post_classes}"}
它似乎仍然应该更容易阅读,因为它是我们一直在做的事情。您是否有任何方法可以使此过程简短易读?
答案 0 :(得分:1)
我认为你所做的很好。我只建议一些小的改进。一种方法是将循环调用放在post_classes中。为了便于阅读,我将使post_classes接受Post参数。这会产生一些冗余,但您可以通过定义此辅助方法轻松避免它:
def classes(object)
case object
when Post then post_classes(object)
end
end
这样,您的模板代码将如下所示:
.post{:class => classes(Post)}