2012-11-14 8 views
6

Ich habe dieses Modell namens Post, idaelly Ich würde gerne nur ein Teil + ONE Layout verwenden, um das folgende zu erreichen.Schienen render sammlung in ul li

, wenn ein einzelnen Objekt-Rendering, Ausgänge:

%div= post.body 

und beim Rendern eine Sammlung, Ausgänge:

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

Zur Zeit habe ich einen Teil Beiträge/post.haml suchen, wie: %li= post.body

und wenn ich eine Sammlung rendere, würde ichtun Sein

Die Probleme:

  1. wann immer eine Sammlung machen, die ich für einzelnes Objekt zu setzen haben die Wiedergabe in% ul
  2. Die teilweise ohne% ul

nicht verwendbar ist zwar In 90% meiner Anwendungsfälle rendere ich eine Sammlung von Posts, es macht keinen Sinn, für einen Postteil nicht als eigenständige Vorlage verwendbar zu sein.


Ich dachte, ich so etwas wie

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

# list_of_posts 
%ul= yield 

# posts/post 
%li= post.body 

würde mein erstes Problem, wenn es funktioniert, aber es funktioniert nicht dies tun könnte lösen. Offenbar nimmt render_collection nicht die Layout-Option, also ist es praktisch eine Sackgasse von dem, was ich beim Rendern der Sammlung finden kann. (Spacer_template könnte möglicherweise funktionieren, aber

  1. </li><li> als Abstandshalter ist in keiner Weise ein gutes Stück Code ..
  2. haml dies nicht erlauben würde)

Was meine zweite Problem, ein einfacher Ausweg würde alles in divs rendern, aber ich bin wirklich ungern, wenn die Dinge in einer Liste sein sollten. Aber um es zum Laufen zu bringen, ist es wahrscheinlich die einzige clean-ish-Lösung. div.list-of-posts > div.post statt ul.posts > li


Ich weiß, dass ich immer so etwas wie

# 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 

aber in diesem Fall tun kann, ich brauche noch ein% ul zu setzen, wenn eine Sammlung übergeben wird.

Oder kann ich sonst noch tun etwas ähnliches, aber vielleicht ein kleines bisschen sauberer:

# 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 

Dies ist die beste/sauberste Weg ich mit so weit kommen kann, irgendwelche Gedanken?

Antwort

1

weiteren Teil hinzufügen, die den li Tag macht und ruft dann den regelmäßigen Teil:

  • app/views/posts/index.html. haml

    %ul.posts= render collection: @posts, partial: "posts/post_li" 
    
  • app/views/posts/_post_li.html.haml

    %li= render post 
    
  • app/views/posts/_post.html.haml

    = div_for post do 
        .... 
    
1

Sie können eine einzelne partielle und innerhalb der partiellen können Sie nur überprüfen, ob die lokale übergeben, ist eine Sammlung oder ein einzelnes Post-Objekt.

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

Und Ihr Teil:

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

Dank. Leider, weil ich für jeden Beitrag nicht nur 'post.body' darstellen würde, wäre es ein großes chuck von divs und As und spannen, sie im Teil wiederholen zu lassen scheint unideal. Ich nehme an, ich kann '- wenn posts.is_a? Post = content_tag (: div) tu else = content_tag (: ul) do = content_tag (: li) tu, aber dann würde die Einrückung durcheinander gebracht werden, wenn ich den post.body html nicht in etwas anderes (sagen wir mal ein anderes Teil) packe. –