цикл в шаблонах - PullRequest
       3

цикл в шаблонах

13 голосов
/ 31 марта 2011

Мой шаблон выглядит так:

  <h2>Oracle</h2>

  <% @q_oracle.each do |q| %>
    <%= link_to(q.title + ' (' + q.answer_count.to_s + ') ' + q.question_id.to_s, 'http://stackoverflow.com/' + q.question_answers_url) %>  </br>

  <% end %>


  <h2>Ruby and Rails</h2>

  <% @q_ruby.each do |q| %>
    <%= link_to(q.title + ' (' + q.answer_count.to_s + ') ' + q.question_id.to_s, 'http://stackoverflow.com/' + q.question_answers_url) %>  </br>

  <% end %>

Таким образом, шаблон состоит из статических заголовков (h2) и проходит через массив. Я ищу способ избежать копирования-вставки кода в моем шаблоне. Что-то вроде:

@hash = { 'Oracle' => @q_oracle, 'Ruby and Rails' => @q_ruby }

@hash.each { |@t, @a|

  <h2>@t</h2>

  <% @a.each do |q| %>
    <%= link_to(q.title + ' (' + q.answer_count.to_s + ') ' + q.question_id.to_s, 'http://stackoverflow.com/' + q.question_answers_url) %>  </br>

  <% end %>
}

Возможно ли это?

Ответы [ 3 ]

27 голосов
/ 31 марта 2011

Да, вы можете сделать это.

Ruby 1.9 раствор

В Ruby 1.8 это решение можно использовать, когда порядок названий не имеет значения. В Ruby 1.9 заголовки будут появляться в том порядке, в котором они были вставлены в хеш.

Просто поместите эту переменную в действие вашего контроллера:

@hash = { 'Oracle' => @q_oracle, 'Ruby and Rails' => @q_ruby }

И получите доступ к этой переменной с вашей точки зрения:

<% @hash.each do |t, a| %>
  <h2><%= t %></h2>
  <% a.each do |q| %>
    <%= link_to(q.title + ' (' + q.answer_count.to_s + ') ' + q.question_id.to_s, 'http://stackoverflow.com/' + q.question_answers_url) %>  </br>
  <% end %>
<% end %>

Ruby 1.8 с отсортированными ключами

Этот метод сортирует ключи так, чтобы они отображались в алфавитном порядке.

<% @hash.keys.sort.each do |t| %>
  <h2><%= t %></h2>
  <% @hash[t].each do |q| %>
    <%= link_to(q.title + ' (' + q.answer_count.to_s + ') ' + q.question_id.to_s, 'http://stackoverflow.com/' + q.question_answers_url) %>  </br>
  <% end %>
<% end %>

Ruby 1.8 с массивами

Этот метод будет вести себя как Ruby 1.9 в любой версии ruby ​​- заголовки будут отображаться в порядке их добавления.

Переменная @hash должна быть инициализирована как:

@hash = [ ['Oracle', @q_oracle], ['Ruby and Rails',@q_ruby] ]

Вид должен быть обновлен до:

<% @hash.each do |title_with_questions| %>
  <h2><%= title_with_questions[0] %></h2>
  <% title_with_questions[1].each do |q| %>
    <%= link_to(q.title + ' (' + q.answer_count.to_s + ') ' + q.question_id.to_s, 'http://stackoverflow.com/' + q.question_answers_url) %>  </br>
  <% end %>
<% end %>
5 голосов
/ 31 марта 2011

Это, конечно, возможно, но в нем заложено огромное количество логики Ruby, что немного вонючее.Я думаю, что было бы лучше выделить дублированную часть тела списка вопросов в частичное.

Главное представление ...

<h2>Oracle</h2>

<%= render :partial => 'question_list', :locals => {:questions => @q_oracle} %>


<h2>Ruby and Rails</h2>

<%= render :partial => 'question_list', :locals => {:questions => @q_ruby} %>

Частичное: _question_list.html.erb ...

  <% questions.each do |q| %>
    <%= link_to(q.title + ' (' + q.answer_count.to_s + ') ' + q.question_id.to_s, 'http://stackoverflow.com/' + q.question_answers_url) %>  </br>

  <% end %>

Этот подход более удобен для чтения, чем вложенный цикл, и он также более гибок в плане настройки структуры страницы.Например: что, если вы хотите применить разные стили к каждому списку или поместить разделитель между ними?

0 голосов
/ 31 марта 2011

Но, конечно, можно пройти через Hash.

<% @hash.each do |title, var|
  <h2><%= title %></h2>
  ... so forth ...
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...