Ruby on Rails: raggruppamento post del blog per mese
-
22-08-2019 - |
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:)
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!