2012-11-14 43 views
6

मेरे पास इस मॉडल को पोस्ट कहा जाता है, idallyly मैं निम्नलिखित प्राप्त करने के लिए केवल एक आंशिक + एक लेआउट का उपयोग करना पसंद करूंगा।उल ली में संग्रह प्रस्तुत करता है

जब एक वस्तु, आउटपुट प्रतिपादन:

%div= post.body 

और जब एक संग्रह, प्रतिपादन आउटपुट:

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

वर्तमान में मैं एक आंशिक पदों/post.haml की तरह लग रही है: %li= post.body

और जब भी मैं एक संग्रह प्रस्तुत कर रहा हूं, तो मैंकरूँगा

समस्याओं जा रहा है:

  1. एक संग्रह प्रतिपादन, मैं% उल में प्रतिपादन डाल करने के लिए जब भी
  2. आंशिक नहीं एक वस्तु के लिए प्रयोग करने योग्य बिना% उल

हालांकि है मेरे उपयोग के 9 0% मामलों में मैं पोस्ट का संग्रह प्रस्तुत कर रहा हूं, यह एक पोस्ट आंशिक के लिए एक स्टैंडअलोन टेम्पलेट के रूप में उपयोग करने योग्य नहीं है।


मैंने सोचा कि मैं की तरह

# 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 इस की अनुमति नहीं होगी)

मेरी दूसरी के रूप में समस्या, एक आसान तरीका divs में सबकुछ प्रस्तुत करेगा, लेकिन जब मैं सूची में होना चाहिए तो मैं वास्तव में ऐसा करने में अनिच्छुक हूं। लेकिन इसे काम करने के लिए, यह शायद एकमात्र साफ-आश समाधान है। div.list-of-posts > div.postul.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 

कुछ कर सकते हैं लेकिन इस मामले में मैं अभी भी एक% उल जब भी एक संग्रह पारित हो जाता है डाल करने के लिए की जरूरत है।

वरना मैं इसी तरह की, लेकिन शायद एक छोटा सा क्लीनर कुछ कर सकते हैं:

# 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 टैग renders और फिर जोड़ें invokes नियमित आंशिक:

  • एप्लिकेशन/विचारों/पदों/index.html। हैमल

    %ul.posts= render collection: @posts, partial: "posts/post_li" 
    
  • एप्लिकेशन/विचारों/पदों/_post_li.html.haml

    %li= render post 
    
  • एप्लिकेशन/विचारों/पदों/_post.html.haml

    = div_for post do 
        .... 
    
1

आपके पास एक आंशिक और आंशिक के अंदर हो सकता है, यह सिर्फ यह देखने के लिए जांच सकता है कि स्थानीय पास इसे संग्रहीत करता है या एक पोस्ट ऑब्जेक्ट है।

# 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 का एक बड़ा हिस्सा होगा और जैसे ही और आंशिक रूप से आंशिक रूप से दोहराए जाने पर उन्हें अनौपचारिक लगता है। मुझे लगता है कि मैं कर सकता हूं - अगर post.is_a? पोस्ट = content_tag (: div) और करें = content_tag (: ul) do = content_tag (: li) करें 'लेकिन तब इंडेंटेशन गड़बड़ हो जाएगा जब तक कि मैं पोस्ट को किसी अन्य चीज़ में नहीं लेता (कहता हूं, एक और आंशिक)। –