Как мне получить доступ к n-му элементу в массиве ruby?В частности, коллекция will_paginate - PullRequest
1 голос
/ 01 октября 2011

Я использую ruby ​​on rails и will_paginate для вывода сообщений на страницу, подобную этой:

 <div class="posts">
        <% render @posts %>
 </div>

Допустим, я хочу изменить эту страницу, чтобы я отображал некоторые сообщения в разных элементах div: <% render 'posts / post',: post => # первый элемент в коллекции%>

 <div class="second_post">
        <% render 'posts/post', :post => #the second element in the collection %>
 </div>
 </div>

 <div class ="lower_container">
 <div class="posts">
        #may have to run a loop for this last one, to render all the rest of posts. How?
        <% render 'posts/post', :post => #all other posts %>
 </div>
 </div>

В частности, я знаю, что мог бы использовать @ post.first для первого элемента, но не знаю о втором (или третьем, или четвертом элементах). Естественно, мой опыт программирования заставляет меня хотеть делать @post (n), где n - это индекс элемента, к которому я хочу получить доступ. Это не работает в рубине.

К вашему сведению: коллекция записей создается в контроллере с помощью:

  @posts = Post.paginate(:page => params[:page])

Кто-нибудь знает, как мне лучше всего достичь этой цели? Я знаю, что это может показаться нетрадиционным, но для аспектов html / UI, которые я действительно хочу сделать, есть div'ы, подобные этому ..

Ответы [ 2 ]

0 голосов
/ 01 октября 2011

Вы можете использовать селекторы nth-child в CSS3 для нацеливания на определенные div.Например, если ваш код выглядел следующим образом:

<div id="posts">
<% @posts.each do |post| %>
  <div>
    <%= post.content %>
  </div>
<% end %>
</div>

Тогда вы можете нацелить первую и вторую <div> следующим образом:

div#posts div:nth-child(1) { }
div#posts div:nth-child(2) { }

jQuery также может выбрать их таким же образом,и добавьте к ним классы, если вам это необходимо:

$('div#posts div:nth-child(1)').addClass('firstPost');

Обновление:

Хорошо, после вашего ответа я бы предложил использовать вспомогательный метод each_with_index при итерациичерез вашу коллекцию, вот так:

<% @posts.each_with_index do |post, index| %>
  <% if index == 0 %>
    <div class="specialFirstIndexClass">
      <%= post.content %>
    </div>
  <% end %>
  <% if index == 1 %>
    <div class="specialSecondIndexClass">
      <%= post.content %>
    </div>
  <% end %>
<% end %>

Или вы можете использовать переключатель Ruby вот так, как они симпатичны:

<% @posts.each_with_index do |post, index| %>
  <% case index %>
  <% when 0 %>
    <div class="specialFirstIndexClass">
      <%= post.content %>
    </div>
  <% when 1 %>
    #etc..
  <% else %>
    <div class="notSoSpecial"><%= post.content %></div>
  <% end %>
<% end %>

Надеюсь, это поможет :)

0 голосов
/ 01 октября 2011

Внутри вашего частичного вы можете позвонить:

<%= posts_counter %>

или <partial_name>_counter

...