0

我有以下要求。

例如:有一个事务表,其中包含事务名称和金额列。我想遍历交易并显示它们的详细信息(transaction_name 和金额),最后我想在页面的头部(循环之前)部分显示总金额(所有金额的总和)。(将其视为摘要显示)

示例页面结构就像

所有交易的总和 - 200

交易金额 trn1 100 trn2 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 %>

我在视图内使用 with (不在布局内

我正在使用导轨 2.2.2

请帮助我,让我知道是否有更好的方法

提前致谢

干杯

同龄人

编辑:

实际上我想要做的是,在特定循环之前显示一些细节,这些细节可以在循环之后收集

例如:如果我有一个事务对象数组,我想在我的视图中的事务循环之前显示通过和失败事务的计数

谢谢

4

4 回答 4

3

在您确实需要重用 content_for 的其他情况下,以下内容可能会有用。

在 Rails 4 中,您可以作为一个选项传递:flush => true给 content_for:

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

在 Rails 3.1.1(近似)中,您可以通过定义和使用以下内容(例如,在 application_helper 中)从 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

刚刚注意到您对波场的评论。整个干原理并不真正适用于执行微小的逻辑,例如遍历数组。

于 2010-09-01T12:30:10.907 回答
0

在 Rails 3 中,您可以在 content_for 之后屈服;所以你的代码将变成:

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