如何将以下代码转换为后者?
<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()
没有显示 - 这是因为我没有使用可打印的ruby标签(<%= # %>
)但是使用它们会转储在内容下面的FAQ对象。
我考虑使用puts()
在ruby标记内打印content_tag()
,但这不起作用。
我试图搜索这个问题,但没有产生任何有用的东西。
这是否可以实现,如果可行,除了更漂亮之外,它还有什么好处吗?
答案 0 :(得分:3)
如果可以将循环体放在辅助函数中并从中返回content_tag
的输出,则使后面的代码有效的一种方法。视图文件中的行可能有点像这样。
<%= @faqs.empty? ? content_tag(:p, "No FAQs to display.") : printList(@faqs) %>
并且您的printList
函数将返回嵌套content_tag
的输出。您可以创建一个通用列表打印功能,可以用于任何列表。
一些如此明显但仍然分享的东西。
答案 1 :(得分: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
答案 2 :(得分: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 %>