可以在Ruby中的单行使用条件和循环吗?

时间:2012-09-13 10:17:48

标签: ruby-on-rails 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()没有显示 - 这是因为我没有使用可打印的ruby标签(<%= # %>)但是使用它们会转储在内容下面的FAQ对象。

我考虑使用puts()在ruby标记内打印content_tag(),但这不起作用。

我试图搜索这个问题,但没有产生任何有用的东西。

这是否可以实现,如果可行,除了更漂亮之外,它还有什么好处吗?

3 个答案:

答案 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 %>