2013-08-25 26 views
0

控制器:创建博客归档

class PostsController < ApplicationController 
def index 
    @posts = Post.published  

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @posts } 
    end 
end 

    def show  
    . 
    . 
    end 

    def month 
    @posts_by_month = Post.find(:all, :order => "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 

帖子#月份查看:

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

<% end %> 

帖子#索引视图:

<h1>Listing posts</h1> 

<%= render :partial => @posts %> 

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

我创建的轨道一个博客,我想我会添加一个档案部分,您通常会在许多博客的边栏中看到这一部分。当我导航到posts#month视图时,它将月份显示为标题,并列出了该月内所有发布的帖子。

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

我不确定要在posts#index视图上放什么来完成此操作。任何关于如何放置或者更好的实施方法的想法都是很棒的。

任何帮助表示赞赏!

回答

2

我总是为分组做的是这样的:

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

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

<div id="post-archive"> 
    <% @posts_by_month.each do |month, posts| %> 
    <h4><%= "#{month.strftime('%B %Y')} (#{posts.count}):" %></h4> 
    <ul> 
    <% for post in posts %> 
     <li><%= link_to post.title, post %></li> 
    <% end %> 
    </ul> 
    <% end %> 
</div> 

和地点将需要写这个<%= render :partial => "posts/post_archive" %>

UPDATE :

在你的控制器创建行动:

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

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

是的,这与我已经很相似。这提供了一个月内发布的帖子列表。我试图做的是在索引页面上创建一个名为'August'的链接,例如,导航到在8月份列出帖子的页面。任何想法如何做到这一点? – Kane

+0

一个例子是这个博客http://sethgodin.typepad.com/。查看档案部分的左侧。注意有几个月的时间,如果你点击月份显示那个月的帖子。这是我想要做的。 – Kane

+0

好吧我更新了我的答案 – zolter

0

在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

<h1>Listing posts</h1> 
<%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 %> 

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

然后更改posts_controller月份采取行动,接受两个参数PARAMS [:每月] & PARAMS [:年]

希望这将有助于

1

如果有人为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 

希望这会帮助别人。

+0

我知道我之前看过您的帖子,并且因为这个确切原因我最终需要它。谢谢! –