Rails渲染集合在ul li中

Mu-*_*iou 6 collections haml ruby-on-rails render partial

我有这个名为Post的模型,idaelly我很想使用一个局部+一个布局来实现以下功能.

渲染单个对象时,输出:

%div= post.body
Run Code Online (Sandbox Code Playgroud)

在渲染集合时,输出:

%ul
  %li= post.body
  %li= post.body
  %li= post.body
Run Code Online (Sandbox Code Playgroud)

目前我有一个部分帖子/ post.haml看起来像: %li= post.body

每当我渲染一个集合时,我都会这样做%ul=render @posts

问题是:

  1. 每当渲染一个集合时,我都必须将渲染放在%ul中
  2. 部分不适用于没有%ul的单个对象

虽然在我的90%的用例中我正在渲染一个帖子的集合,但是对于一个不能作为独立模板使用的帖子来说没有意义.


我以为我可以做点什么

# view
render partial: 'post', collection: @posts, layout: 'list_of_posts'

# list_of_posts
%ul= yield

# posts/post
%li= post.body
Run Code Online (Sandbox Code Playgroud)

如果它工作,这将解决我的第一个问题,但事实并非如此.显然,render_collection不采用布局选项,因此它几乎是我在渲染集合中找到的死胡同.(Spacer_template可能有用,但是

  1. </li><li> 作为间隔符绝不是一段好的代码..
  2. 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
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我仍然需要在传递集合时输入%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
Run Code Online (Sandbox Code Playgroud)

这是迄今为止我能想出的最好/最干净的方式,有什么想法吗?

mea*_*gar 1

添加另一个呈现li标签的部分,然后调用常规部分: