1

如何将以下代码转换为后者?

<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​​ 标签 ( <%= # %>) 但使用它们会转储内容下方的常见问题解答对象。

我考虑使用在红宝石标签内puts()打印content_tag()while,但这没有用。

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

这是可以实现的吗?如果可以,除了更漂亮之外,它还有其他好处吗?

4

3 回答 3

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
于 2012-09-13T10:43:11.827 回答
3

如果您可以将循环体放在辅助函数中并content_tag从中返回输出,则可以使后面的代码工作的一种方法。视图文件中的行可能有点像这样。

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

并且您的printList函数将返回嵌套content_tags 的输出。您可以制作可用于任何列表的通用列表打印功能。

一些如此明显但仍然共享的东西。

于 2012-09-13T10:40:10.303 回答
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 %>
于 2012-09-13T10:30:34.857 回答