Рельсы дают - проблема контента - PullRequest
0 голосов
/ 01 сентября 2010

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

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

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

Сумма всех транзакций - 200

сумма транзакции трлн 100 трн2 50 трн3 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 ]

3 голосов
/ 12 июня 2014

В других случаях, когда вам действительно нужно повторно использовать 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
2 голосов
/ 01 сентября 2010

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

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

0 голосов
/ 22 августа 2014

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

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

0 голосов
/ 01 сентября 2010

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

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

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

<%= calculate_total(@transactions) %>
...