我有一个名为 Post 的模型,我很想只使用 ONE 部分 + ONE 布局来实现以下目标。
渲染单个对象时,输出:
%div= post.body
并在渲染集合时,输出:
%ul
%li= post.body
%li= post.body
%li= post.body
目前我有部分帖子/post.haml 看起来像:%li= post.body
每当我渲染一个集合时,我都会做%ul=render @posts
问题是:
- 每当渲染一个集合时,我必须将渲染放在 %ul
- 没有 %ul 的部分不能用于单个对象
尽管在我 90% 的用例中,我都在渲染一组帖子,但不将帖子部分用作独立模板是没有意义的。
我以为我可以做类似的事情
# view
render partial: 'post', collection: @posts, layout: 'list_of_posts'
# list_of_posts
%ul= yield
# posts/post
%li= post.body
如果它有效,这将解决我的第一个问题,但它没有。显然 render_collection 不采用布局选项,所以它实际上是我在渲染集合中可以找到的死胡同。(Spacer_template 可能会起作用,但是
</li><li>
作为垫片绝不是一段好的代码..- haml 不允许这样做)
至于我的第二个问题,一个简单的方法是在 div 中渲染所有内容,但是当事情应该在列表中时,我真的不愿意这样做。但为了让它发挥作用,它可能是唯一干净的解决方案。div.list-of-posts > div.post
代替ul.posts > li
我知道我总是可以做类似的事情
# view - collection
%ul= render @posts, in_list: true
# view - object
= render @post
# posts/post.haml
- post_counter ||= false
- tag = post_counter ? :li : :div
= content_tag tag do
= post.body
但在这种情况下,每当通过集合时,我仍然需要放置一个 %ul 。
否则我可以做一些类似的事情,但也许更干净一点:
# view - collection of objects
= render 'posts', posts: @posts
# view - object
= render @post
# posts/posts.haml
%ul
= render post
# posts/post.haml
- post_counter ||= false
- tag = post_counter ? :li : :div
= content_tag tag do
= post.body
这是迄今为止我能想到的最好/最干净的方法,有什么想法吗?