2013-08-25 65 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

我知道我之前看過您的帖子,並且因爲這個確切原因我最終需要它。謝謝! –