2012-11-14 118 views
6

我有称为Post的这个模型,idaelly我很乐意只使用ONE部分+ ONE布局来实现以下功能。Ra ul在ul li中渲染集合

%div= post.body 

和渲染的集合,当输出:

%ul 
    %li= post.body 
    %li= post.body 
    %li= post.body 

目前,我有一个部分职位/ 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 

这是否行得通会解决我的第一个问题,但事实并非如此。显然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 

但在这种情况下,我仍然需要投入每当收集传递一个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 

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

回答

1

添加另一个局部这使得li标签,然后调用常规部分:

  • 应用程序/视图/职位/ index.html的。 haml

    %ul.posts= render collection: @posts, partial: "posts/post_li" 
    
  • 应用程序/视图/职位/ _post_li.html.haml

    %li= render post 
    
  • 应用程序/视图/职位/ _post.html.haml

    = div_for post do 
        .... 
    
1

你可以有一个局部和局部的内部,它可以检查传递给它的本地是一个集合还是一个Post对象。

# Render calls 
render :partial => "posts/display_posts", :locals => {:posts => Post.first} 
render :partial => "posts/display_posts", :locals => {:posts => Post.all} # collection 

而且你的部分:

- if posts.is_a? Post # single item 
    %div= posts.body 
- else 
    %ul 
    - posts.each do |post| 
    %li= post.body 
+1

感谢。不幸的是,因为对于每一篇文章,我不会只是渲染'post.body',这将是divs和As的大挑战,并且跨越,让它们在部分中重复似乎是不合理的。 我想我可以做' - 如果posts.is_a? Post = content_tag(:div)do else = content_tag(:ul)do = content_tag(:li)做'但是然后缩进会被搞砸,除非我把post.body的html抓到别的东西(比如另一个部分)。 –