0

次の要件があります。

例:transaction_nameとamountなどの列があるトランザクションテーブルがあります。トランザクションをループして詳細(transaction_nameとamount)を表示し、最後にページの先頭(ループの前)セクションに合計金額(すべての金額の合計)を表示したいと思います。(要約表示として考えてください)

ページ構造の例は次のようになります

すべてのトランザクションの合計-200

取引金額trn1100trn2 50 trn3 50

そして、yieldとcontent_forタグを使用しようとしましたが、うまくいきませんでした。

私のコードは次のとおりです(erbファイル内で呼び出しています)。

<%= yield :transaction_summary %> 

<table>
  <% total_amount = 0%>
  <%for transaction in @transactions%>
    <tr>
      <td><%= transaction.transaction_name %></td>
      <td><%= transaction.amount %></td>
      <% total_amount += transaction.amount %>
    </tr>
  <%end%>
  </table>

<% content_for :transaction_summary do %>
   <h1>
     Sum of all the transactions - <%= total_amount %>
   </h1>
<% end %>

ビュー内(レイアウト内ではない)で使用しています

レール2.2.2を使用しています

私を助けて、もっと良い方法があるかどうか教えてください

前もって感謝します

乾杯

sameera

編集:

実際に私がやりたいのは、特定のループの前にいくつかの詳細を表示し、ループの後にそれらの詳細を収集できるようにすることです

例:トランザクションオブジェクトの配列がある場合、トランザクションがループする前に、成功したトランザクションと失敗したトランザクションの数を表示したい

ありがとう

4

4 に答える 4

3

本当にcontent_forを再利用する必要がある他の場合には、以下が役立つかもしれません。

Rails 4では、オプションとしてcontent_forに渡すことができます。:flush => true

<% content_for :example, flush: true do %>
  <h1>Deletes previous content</h1>
<% end %>

Rails 3.1.1(約)では、以下を定義して使用することにより(たとえば、application_helperで)、yield時にview_flowからコンテンツを削除できます。

def yield_and_flush!(content_key)
  view_flow.content.delete(content_key)
end
于 2014-06-12T12:27:39.360 に答える
2

content_forとyieldについて間違った考えを持っていると思います。:) http://guides.rubyonrails.org/layouts_and_rendering.html

   <h1>
     <%= @transactions.collect(&:amount).sum -%>
   </h1> 
   <table>
      <%for transaction in @transactions%>
        <tr>
          <td><%= transaction.transaction_name %></td>
          <td><%= transaction.amount %></td>
        </tr>
      <%end%>
    </table>

編集 -

データの収集に関しては、ヘルパーメソッドに入れることをお勧めします。

#transactions_helper.rb
def transactions_total transactions
  @transactions_total ||= @transactions.collect(&:amount).sum
end

def passed_transactions transactions
  @passed_transactions ||= @transactions.collect{|transaction| transaction.passed == true}
end

def failed_transactions transactions
  @failed_transactions ||= transactions - passed_transactions(transactions)
end

theTRONへのコメントに気づきました。ドライの原則全体は、配列のループなどの小さなロジックの実行には実際には当てはまりません。

于 2010-09-01T12:30:10.907 に答える
0

合計を個別に計算するヘルパーメソッドを作成します。おそらく次のようになります。

# app/helpers/transactions_helper.rb
def calculate_total(transactions)
 total = 0
 transactions.each {|transaction| total += transaction.amount}
 total
end

次に、次の方法で、ビューのどこにでも表示できます。

<%= calculate_total(@transactions) %>
于 2010-09-01T12:29:27.053 に答える
0

Rails 3では、content_forの後にyieldできます。したがって、コードは次のようになります。

<% content_for :transaction_table do %>
  <table>
    <% total_amount = 0%>
    <% for transaction in @transactions do %>
      <tr>
        <td><%= transaction.transaction_name %></td>
        <td><%= transaction.amount %></td>
        <% total_amount += transaction.amount %>
      </tr>
    <%end%>
  </table>

  <% content_for :transaction_summary do %>
     <h1>
       Sum of all the transactions - <%= total_amount %>
     </h1>
  <% end %>
<% end %> <!- End content_for :transaction_table -->


<%= yield :transaction_summary %> 
<%= yield :transaction_table %>

ノート:

<% content_for :transaction_summary do %>

中にいる必要はありません

<% content_for :transaction_table do %>

、しかし、いくつかのより複雑なケースでは、それが可能でした。

于 2014-08-22T13:42:11.967 に答える