Pergunta

caras Hy. Eu criei um aplicativo simples blog com as ações habituais CRUD. Eu também acrescentou uma nova ação na PostController chamado "arquivo" e uma vista associada. Nesta visão eu quero trazer de volta todos os posts e agrupá-los por mês, exibindo-os neste tipo de formato:

March
<ul>
    <li>Hello World</li>
    <li>Blah blah</li>
    <li>Nothing to see here</li>
    <li>Test post...</li>
</ul>

Febuary
<ul>
    <li>My hangover sucks</li>
    ... etc ...

Não consigo para a vida de me descobrir a melhor maneira de fazer isso. Assumindo o modelo Post tem o title de costume, content, created_at etc campos, alguém pode me ajudar com a lógica / code? Eu sou muito novo para RoR tão urso por favor comigo:)

Foi útil?

Solução

group_by é um ótimo método:

controlador:

def archive
  #this will return a hash in which the month names are the keys, 
  #and the values are arrays of the posts belonging to such months
  #something like: 
  #{ "February" => [#<Post 0xb5c836a0>,#<Post 0xb5443a0>],
  # 'March' => [#<Post 0x43443a0>] }
  @posts_by_month = Posts.find(:all).group_by { |post| post.created_at.strftime("%B") }
end

modelo de visão:

<% @posts_by_month.each do |monthname, posts| %>
<%= monthname %>
<ul>
   <% posts.each do |post| %>
     <li><%= post.title %></li>
   <% end %>
</ul>
<% end %>

Outras dicas

@Maximiliano Guzman

Boa resposta! Obrigado por adicionar valor para a comunidade Rails. Eu estou incluindo minha fonte original na Como criar um Blog Archive com Rails , apenas no caso eu açougueiro raciocínio do autor. Baseado no post, para novos desenvolvedores Rails, eu gostaria de acrescentar algumas sugestões.

Primeiro, use registos activos Posts.all para retornar o conjunto de resultados Post para maior velocidade e interoperabilidade. O Posts.find (: all). método é conhecido por ter problemas imprevistos

Finalmente, ao longo da mesma linha, uso beginning_of_month método das extensões do núcleo ActiveRecord. Acho beginning_of_month muito mais legível do que strftime ( "% B") . Claro, a escolha é sua.

A seguir é um exemplo dessas sugestões. Consulte o post original para mais detalhes:

Controladores / archives_controller.rb

def index
    @posts = Post.all(:select => "title, id, posted_at", :order => "posted_at DESC")
    @post_months = @posts.group_by { |t| t.posted_at.beginning_of_month }
end

views / arquivos / indext.html.erb

<div class="archives">
    <h2>Blog Archive</h2>

    <% @post_months.sort.reverse.each do |month, posts| %>
    <h3><%=h month.strftime("%B %Y") %></h3>
    <ul>
        <% for post in posts %>
        <li><%=h link_to post.title, post_path(post) %></li>
        <% end %>
    </ul>
    <% end %>
</div>

Boa sorte e bem vindo ao Rails!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top