2010-09-01 70 views
0

我有以下要求。导轨产量 - content_for问题

例如:有一个事务表,它有列说,事务名和金额。我想遍历事务并显示它们的详细信息(transaction_name和amount),最后我想在页面的头部(循环之前)部分显示总金额(所有金额的总和)。 (想一想作为概要显示)

例页的结构将是像

所有交易的萨姆 - 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 %> 

而且

我使用一个视图中

不是布局内)

我正在使用rails 2.2.2

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

在此先感谢

欢呼

sameera

编辑:

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

例如:如果我有一个事务对象数组,我想显示通过和计数

感谢

回答

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您的评论。整个干燥原理并不适用于执行微小逻辑,例如循环遍历数组。

+0

嗨,马克的更加干燥方式, 感谢您的重播。即使你的例子工作,我有一些更多的功能,如获得通过/失败的交易计数等。 我在想什么是因为我可以得到我的所有细节后循环,是否有任何轨道方式注入这些细节一个HTML DIV是上述循环 我已经更新了我的文章提的是我想做的事情 你是对的,我觉得我会错过再次 感谢理解content_for标签的概念,并欢迎任何帮助:d – sameera207 2010-09-01 15:53:47

+0

嗨sameera。已经更新了我的答案。 – mark 2010-09-01 16:25:21

+0

马克喜 感谢更新 “整个干燥的原理并不真正适用于执行微小的逻辑,如通过数组循环” 那是一个很好的点。 欢呼声 sameera – sameera207 2010-09-03 04:06:45

0

在我看来,交易循环之前导致交易我会写一个单独计算总一个辅助方法,或许是沿着线的东西:

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

然后你就可以在显示它你的看法,无论你喜欢,与:

<%= calculate_total(@transactions) %> 
+0

嗨theTRON 感谢您的回复。但我想要一种在一个循环中获取这些细节的方法。既然你提出的方法,包括在同一个结果两个循环分别设置 1 - helper方法 2 - 在视图中显示详细信息 不知道是否有这样做 欢呼 sameera – sameera207 2010-09-01 15:57:07

2

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

在Rails 4中,可以pass :flush => true作为一个选项content_for:

​​

在Rails 3.1.1(约)可以delete the content from the view_flow when you yield通过定义和使用以下(在application_helper例如):

def yield_and_flush!(content_key) 
    view_flow.content.delete(content_key) 
end 
+0

那''flush => true'只是让我的一天。非常感谢。 – dkonayuki 2015-03-07 18:05:04

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

内,但对于一些比较复杂的情况下,它可以。