2012-09-13 46 views
1

如何將下面的代碼轉換爲後者?可以使用條件並在Ruby中的單行循環?

<div id="faqs"> 
    <% if @faqs.length > 0 %> 
    <% @faqs.each do |faq| %> 
     <div class="faq"> 
     <strong>Q:</strong> <%= faq.question %> 
     <br /> 
     <strong>A:</strong> <%= faq.answer %> 
     </div> 
    <% end %> 
    <% else %> 
    <p>No FAQs to display.</p> 
    <% end %> 
</div> 

<div id="faqs"> 
    <% @faqs.empty? ? content_tag(:p, "No FAQs to display.") : @faqs.each do |faq| %> 
    <div class="faq"> 
     <strong>Q:</strong> <%= faq.question %> 
     <br /> 
     <strong>A:</strong> <%= faq.answer %> 
    </div> 
    <% end %> 
</div> 

我很好奇我是否可以讓後面的代碼工作。即在目前沒有它的唯一要素是content_tag()不顯示 - 這是由於我沒有使用打印紅寶石標籤(<%= # %>),但使用起來會dump出來的內容下面的FAQ對象的事實。

我認爲使用puts()來打印content_tag()而在ruby標籤內,但沒有奏效。

我試圖尋找這個問題,但並沒有產生任何有用的東西。

這是可以實現的,如果是這樣,它有比是漂亮以外的任何好處?

回答

3

的一種方式,使以後的代碼工作,如果你可以把循環體中的一個輔助功能,並返回了從放content_tag。視圖文件中的行可能有點像這樣。

<%= @faqs.empty? ? content_tag(:p, "No FAQs to display.") : printList(@faqs) %> 

和你printList函數將返回嵌套content_tag S的輸出。您可以製作可用於任何列表的通用列表打印功能。

東西很明顯,但仍然共享。

0

這應該工作:

<% if @faqs.each do |faq| %> 
    <div class="faq"> 
    <strong>Q:</strong> <%= faq.question %> 
    <br /> 
    <strong>A:</strong> <%= faq.answer %> 
    </div> 
<% end.empty? %> 
    <p>No FAQs to display.</p> 
<% end %> 
+0

-1雖然它的工作,這是一個相當醜陋的代碼。從'each'循環讀取返回值? PUH - 萊茲。 –

3

這應該工作(爲清楚起見,我搬到單獨的輔助方法,FAQ標籤代):

<div id="faqs"> 
    <%= raw (@faqs.empty? ? content_tag(:p, "No FAQs to display.") : @faqs.map { |faq| faq_div(faq) }.join) %> 
</div> 

或者更乾淨:

<div id="faqs"> 
    <%= content_tag(:p, "No FAQs to display.") if @faqs.empty? %> 
    <%= raw @faqs.map { |faq| faq_div(faq) }.join %> 
</div> 

同時,在助手:

def faq_div(faq) 
    '<div class="faq"><strong>Q:</strong> %s<br /><strong>A:</strong> %s</div>' % [faq.question, faq.answer] 
end 
+0

測試成功 - 感謝您提出一個乾淨而有用的解決方案。 – admpsktt

相關問題