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()が表示されていないことです。これは、印刷可能なルビータグ(<%= # %>)を使用していないためですが、それらを使用すると、コンテンツの下にあるFAQオブジェクトがダンプされます。

puts()ルビータグの中にある間を印刷するための使用を検討しましたcontent_tag()が、それは機能しませんでした。

私はこの問題を検索しようとしましたが、有用なものは何も得られませんでした。

これは達成可能ですか?もしそうなら、それはよりきれいになる以外に何か利点がありますか?

4

3 に答える 3

3

ループの本体をヘルパー関数に入れて、content_tagそこから出力を返すことができる場合に、後のコードを機能させる1つの方法。ビューファイルの行は、次のようになります。

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

printList関数はネストされたsの出力を返しますcontent_tag。任意のリストに使用できる汎用リスト印刷機能を作成できます。

とても明白ですが、それでも共有されている何か。

于 2012-09-13T10:40:10.303 に答える
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 に答える
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 に答える