Frage

Hy Jungs. Ich habe einen einfachen Blog-App mit den üblichen CRUD Aktionen erstellt. Außerdem habe ich eine neue Aktion in dem Postcontroller als „Archiv“ und eine zugehörige Ansicht. In dieser Ansicht möchte ich alle diese Blog-Posts und Gruppe von Monat bringen, so dass sie in dieser Art von Format angezeigt wird:

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 ...

Ich kann nicht für das Leben von mir herauszufinden, die beste Art und Weise aus, dies zu tun. Unter der Annahme, das Post-Modells hat die üblichen title, content, created_at etc Felder, kann mir jemand helfen, mit der Logik / code? Ich bin sehr neu zu RoR so bitte Geduld mit mir:)

War es hilfreich?

Lösung

group_by ist eine großartige Methode:

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

Ansicht Vorlage:

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

Andere Tipps

@Maximiliano Guzman

Gute Antwort! Vielen Dank für Wert an die Rails-Community hinzufügen. Ich schließe meine ursprüngliche Quelle auf Wie ein Blog Archive mit Rails erstellen , nur für den Fall Metzger ich die Argumentation des Autors. Basierend auf der Blog-Post, für neue Entwickler zu Rails, würde ich ein paar Vorschläge hinzufügen.

Verwenden Sie zunächst Aktive Aufzeichnungen Posts.all Methode, um die Post zu Rückergebnis für erhöhte Geschwindigkeit und Interoperabilität festgelegt. Der Posts.find (: alle). Methode ist bekannt, unvorhergesehene Probleme haben,

Schließlich entlang der gleichen Ader, verwenden Sie beginning_of_month Methode aus den Active Kern-Erweiterungen. Ich finde beginning_of_month viel besser lesbar als strftime ( "% B") . Natürlich ist die Wahl.

Im Folgenden finden Sie ein Beispiel für diese Vorschläge. Bitte beachten Sie die ursprüngliche Blog-Post für weitere Einzelheiten:

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

Ansichten / Archiv / 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>

Viel Glück und willkommen auf Schienen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top