Рельсы дают - проблема контента
У меня есть следующее требование.
Пример: есть таблица транзакций, в которой есть столбцы, например, имя_ транзакции и сумма. Я хочу просмотреть транзакции и отобразить их детали (имя_ транзакции и сумма), и, наконец, я хочу отобразить общую сумму (сумму всех сумм) в разделе заголовка (до цикла) моей страницы. (Думайте об этом как краткое отображение)
Пример структуры страницы будет выглядеть так:
Сумма всех транзакций - 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 %>
, но для некоторых более сложных случаев это возможно.