Rails产生 - content_for问题

时间:2010-09-01 12:16:12

标签: ruby-on-rails views yield content-for

我有以下要求。

Ex:有一个事务表,其中包含列,例如,transaction_name和amount。我想遍历事务并显示它们的详细信息(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

编辑:

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

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

感谢

4 个答案:

答案 0 :(得分:3)

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

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

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

在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

答案 1 :(得分: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的评论。整个干原理并不适用于执行微型逻辑,例如循环遍历数组。

答案 2 :(得分:0)

我会编写一个帮助方法来单独计算总数,也许还有以下几点:

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

然后,您可以随时随地在视图中显示它:

<%= calculate_total(@transactions) %>

答案 3 :(得分: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 %>

,但对于一些更复杂的案例,它可以。