2009-07-03 27 views
5

Hy男。私は通常のCRUDアクションを使って簡単なブログアプリを作成しました。私はPostControllerに "archive"という名前の新しいアクションと関連するビューを追加しました。Ruby on Rails:月ごとにブログ投稿をグループ化する

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

私は私の人生のためにこれを行うための最善の方法を把握することはできません。このビューでは、私はフォーマットのこの種でそれらを表示し、月ごとにバックすべてのブログ記事やグループにそれらを持って帰りたいと思います。投稿モデルが通常のtitlecontentcreated_atなどのフィールドを持っているとすれば、誰かがロジック/コードで私を助けることができますか?私はRoRのに非常に新しいですので、私と一緒に負担してください:)

答えて

31

GROUP_BYは素晴らしい方法です。

コントローラ:

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 

ビューテンプレート:

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

これはOPに関連しています。*年月を翌年に転記すると(2010年)、1月のセクションには2009年と2010年の両方のエントリが含まれます。 *毎月のエントリを(日)の日付でソートして、リストが年代順であることを確認することができます。 – BryanH

+2

完璧なソリューション!ありがとう非常に:) –

+0

私は自分のビュー内のレコードのグループを表示するための自分の同様のgroup_by機能をやってきました。うれしい私はこれを発見した。 –

7

@Maximilianoグスマン

Railsコミュニティに価値を追加していただき、ありがとうございます。私は元のソースをHow to Create a Blog Archive with Railsに含めています。ブログ投稿に基づいて、Railsの新しい開発者のために、私はいくつかの提案を追加したいと思います。

まず、Active Records Posts.allメソッドを使用して、速度と相互運用性を向上させるためにPost結果セットを返します。 Posts.find(:all)メソッドは予期しない問題があることが知られています。

最後に、同じ静脈に沿って、ActiveRecordコア拡張のbeginning_of_monthメソッドを使用します。私はbegin_of_monthよりもはるかに読みやすいstrftime( "%B")を見つける。もちろん、選択はあなたのものです。

以下は、これらの提案の例です。さらに詳細のために、元のブログ記事を参照してください。

コントローラ/ 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 

ビュー/アーカイブ/ 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> 

幸運とレールに歓迎!

+0

Wahhh .. nice ..すごくスティーブ! – Abhi

+0

@steve、それはどうですか、どんなスピードにも影響しますか?**を使用したくない場合は、この行を使用しますか? ":タイトル、id、posted_at"、::order => "posted_at DESC")**。 ** @ posts = Post.order( 'created_at DESC')。グループ_by {| post | post.created_at.beginning_of_month} ** – JAML

関連する問題