So I finally got around to replacing the dummy text in the sidebar with real, working archive links, and it was stupidly easy. Check it out...
First, I added a helper method to take all published posts and group them by the month they were created.
def archives
@archives = Post.published.in_order.all.group_by { |t| t.created_at.beginning_of_month}
end
Then I used that helper method to display links for each month in which posts were created.
-
<% archives.each do |month, posts| %>
- <%= link_to(month.strftime('%B')+" (#{posts.size})", archive_path(:month => month.month, :year => month.year)) %> <% end %>
You probably noticed the archive_path named route that the links point to. Here's how I set it up.
map.archive '/posts/:year/:month', :controller => 'posts', :action => 'archive'
That route points to the archive action of the posts controller which merely retrieves the posts created within the specified month and renders the list view.
def archive
@posts = Post.published.in_order.from_month(Time.parse "#{params[:month]}/#{params[:year]}").paginate(:page => params[:page], :per_page => 5)
render :action => 'index'
end
The archive action uses a from_month named scope on the Post model to restrict the find to all posts created within a given month.
named_scope :from_month, lambda { |month| {:conditions => {:created_at => month..(month + 1.month)}} }
That's it. That's all it takes to set up simple archive links for your blog.

