Выход Rails — проблема с content_for

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

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

Примерная структура страницы будет такой

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

сумма сделки трн1 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

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

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

ваше здоровье

Самера

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

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

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

Благодарность


person sameera207    schedule 01.09.2010    source источник


Ответы (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

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

person mark    schedule 01.09.2010
comment
Привет Марк, Спасибо за повтор. Несмотря на то, что ваш пример работает, у меня есть еще несколько функций, таких как получение количества пройденных/неудачных транзакций и т.д. html DIV, который находится над циклом. Я обновил свой пост, упомянув, что я хочу сделать. И вы правы, я думаю, что я не понял концепцию тега content_for, еще раз спасибо, и любая помощь приветствуется: D - person sameera207; 01.09.2010
comment
Привет, Марк. Спасибо за обновление. Весь сухой принцип на самом деле не применим к выполнению крошечной логики, такой как перебор массива, это хороший момент. ура Самера - person sameera207; 03.09.2010

В других случаях, когда вам действительно нужно повторно использовать 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
person robd    schedule 12.06.2014
comment
что :flush => true только что сделал мой день. большое спасибо. - person dkonayuki; 07.03.2015

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

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

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

<%= calculate_total(@transactions) %>
person theTRON    schedule 01.09.2010
comment
Привет theTRON Спасибо за ответ. Но мне нужен способ получить эти детали в одном цикле. Поскольку предлагаемый вами метод включает в себя два цикла в одном и том же наборе результатов, а именно 1 - вспомогательный метод 2 - для отображения деталей в представлении интересно, есть ли еще СУХОЙ способ сделать это, приветствую жемеру - person sameera207; 01.09.2010

В Rails 3 вы можете использовать yield после 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 %>

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

person sn1p3    schedule 22.08.2014