Рельсы дают - проблема контента

У меня есть следующее требование.

Пример: есть таблица транзакций, в которой есть столбцы, например, имя_ транзакции и сумма. Я хочу просмотреть транзакции и отобразить их детали (имя_ транзакции и сумма), и, наконец, я хочу отобразить общую сумму (сумму всех сумм) в разделе заголовка (до цикла) моей страницы. (Думайте об этом как краткое отображение)

Пример структуры страницы будет выглядеть так:

Сумма всех транзакций - 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 %>

А также

Я использую с внутренним видом (не внутри макета)

Я использую рельсы 2.2.2

Пожалуйста, помогите мне и дайте мне знать, если есть лучший способ

заранее спасибо

ура

Sameera

РЕДАКТИРОВАТЬ:

На самом деле то, что я хочу сделать, это показать некоторые детали перед конкретным циклом, где эти детали могут быть собраны после цикла

Пример: если у меня есть массив объектов транзакций, я хочу показать количество проходов и неудачных транзакций до цикла транзакций в моем представлении

Спасибо

4 ответа

Решение

Я думаю, у вас неправильное представление о 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

Просто заметил твой комментарий к ТРОНУ. Весь сухой принцип на самом деле не применим к выполнению крошечной логики, такой как цикл по массиву.

В других случаях, когда вам действительно нужно повторно использовать content_for, может быть полезно следующее.

В Rails 4 вы можете пройти:flush => true в качестве опции для content_for:

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

В Rails 3.1.1 (приблизительно) вы можете удалять содержимое из view_flow, когда вы уступаете, определяя и используя следующее (например, в application_helper):

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

Я написал бы вспомогательный метод, который вычисляет сумму отдельно, возможно, что-то вроде:

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

Затем вы можете отобразить его в своем представлении, где вы хотите, с помощью:

<%= calculate_total(@transactions) %>

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

, но для некоторых более сложных случаев это возможно.

Другие вопросы по тегам