在rails中创建博客存档

控制器:

class PostsController  "created_at DESC").group_by { |post| post.created_at.strftime("%B %Y") } respond_to do |format| format.html # index.html.erb format.json { render json: @posts } end end end 

post#个月查看:

  

post#index视图:

 

Listing posts

@posts %>

Blog archive

我正在使用rails创建一个博客,我想我会在许多博客的侧边栏中添加您常见的归档部分。 当我导航到posts#month视图时,它会将posts#month显示为标题,并列出该月份发布的所有post。

我现在要做的是有一个月份列表,用于发布posts#index视图,每个月链接到上述posts#month视图。

我不确定在posts#index视图上放什么来完成这个。 关于放置什么或者更好的方法来实现这一点的任何想法都会很棒。

任何帮助赞赏!

我总是通过这种方式进行分组:

 @posts_by_month = Post.find(:all, :order => "created_at DESC").group_by { |post| post.created_at.beginning_of_month } 

然后创建例如posts/_post_archive.html.erb

 
<% @posts_by_month.each do |month, posts| %>

<%= "#{month.strftime('%B %Y')} (#{posts.count}):" %>

    <% for post in posts %>
  • <%= link_to post.title, post %>
  • <% end %>
<% end %>

在需要的地方写下这个<%= render :partial => "posts/post_archive" %>

更新:

在您的控制器中创建操作:

 def by_year_and_month @posts = Post.where("YEAR(created_at) = ? AND MONTH(created_at) = ? ", params[:year], params[:month]).order("created_at DESC") end 

在您的routes.rb

 match 'posts/by_year_and_month/:year/:month' => 'posts#by_year_and_month', :as=> :posts_by_year_and_month 

并修改我们的posts/_posts_archive.html.erb

 

<%= link_to "#{month.strftime('%B %Y')} (#{posts.count}):", posts_by_year_and_month_path(:year=> month.year, :month => month.month) %>

如果有人为Postgres尝试此操作,上述方法将无效。

 def by_year_and_month @posts = Post.where("YEAR(created_at) = ? AND MONTH(created_at) = ? ", params[:year], params[:month]).order("created_at DESC") end 

所以你可以这样做,

 def by_year_and_month @posts = Post.where('extract(year from created_at) = ?', params[:year]).where('extract(month from created_at) = ?', params[:month]).order("created_at DESC") end 

希望这会对某人有所帮助。

在PostsController中

 def index @posts = Post.published @grouped_posts = Post.select("COUNT( * ) AS posts, MONTHNAME( created_at ) AS MONTH , YEAR( created_at ) AS YEAR").group("MONTH, YEAR").order("YEAR, MONTH( created_at )") respond_to do |format| format.html # index.html.erb format.json { render json: @posts } end end 

然后在视图index.html.erb中

 

Listing posts

<%grouped_posts.each do |rec|%> <%=link_to "#{rec.month} #{rec.year} (#{rec.posts})", {:controller => "posts", :action => "month", :month => rec.month, :year => rec.year} %> <%end%> <%= render :partial => @posts %>

Blog archive

<%= ?I want link to single months archive here? %>

然后更改posts_controller中的月份操作以接受两个参数params [:month]&params [:year]

希望这会有所帮助