2012-11-14 162 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抓到別的東西(比如另一個部分)。 –