Domanda

ragazzi Hy. Ho creato una semplice applicazione blog con le solite azioni CRUD. Ho anche aggiunto una nuova azione nel PostController denominata "archivio" e una vista associata. In questa prospettiva vorrei riportare tutti i post del blog e raggrupparli per mese, la visualizzazione in questo tipo di 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 ...

Non posso per la vita di me capire il modo migliore per farlo. Supponendo che il modello Post ha il title solito, content, created_at ecc campi, qualcuno mi può aiutare con la logica / codice? Sono molto di nuovo da RoR quindi per favore portare con me:)

È stato utile?

Soluzione

group_by è un ottimo metodo:

Controller:

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

vista template:

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

Altri suggerimenti

@Maximiliano Guzman

Buona risposta! Grazie per l'aggiunta di valore per la comunità Rails. Sto compresa la mia fonte originale sul Come creare un archivio di blog con Rails , nel caso in cui io macelleria ragionamento dell'autore. Sulla base del post sul blog, per i nuovi sviluppatori a Rails, mi piacerebbe aggiungere un paio di suggerimenti.

In primo luogo, utilizzare i record attivi Posts.all metodo per restituire il Post set di risultati per una maggiore velocità e l'interoperabilità. Il Posts.find (: all). metodo è noto per avere problemi imprevisti

Infine, lungo la stessa linea, utilizzare beginning_of_month metodo dalle estensioni nucleo ActiveRecord. Trovo beginning_of_month molto più leggibile di strftime ( "% B") . Naturalmente, la scelta è vostra.

Di seguito è riportato un esempio di questi suggerimenti. Si prega di vedere il post del blog originale per ulteriori dettagli:

controllori / 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

viste / archives / 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>

Buona fortuna e benvenuto alle rotaie!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top