Ruby on rails 在rails中创建博客存档

Ruby on rails 在rails中创建博客存档,ruby-on-rails,Ruby On Rails,控制器: 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

控制器:

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
class PostsController“created_at DESC”).group_by{Post | Post.created_at.strftime(“%B%Y”)}
回应待办事项|格式|
format.html#index.html.erb
format.json{render json:@posts}
结束
结束
结束
帖子#月视图:

<% @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? %>
列出帖子
@帖子%>
博客档案
我正在rails中创建一个博客,我想我会添加一个归档部分,您通常会在许多博客的侧栏中看到这个部分。当我导航到
posts#month
视图时,它会将该月显示为标题,并列出该月内发布的所有帖子

我现在想做的是在
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/\u post\u 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>
match 'posts/by_year_and_month/:year/:month' => 'posts#by_year_and_month', :as=> :posts_by_year_and_month
<h4><%= link_to "#{month.strftime('%B %Y')} (#{posts.count}):", posts_by_year_and_month_path(:year=> month.year, :month => month.month) %></h4>
在您的
routes.rb中:

<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>
match 'posts/by_year_and_month/:year/:month' => 'posts#by_year_and_month', :as=> :posts_by_year_and_month
<h4><%= link_to "#{month.strftime('%B %Y')} (#{posts.count}):", posts_by_year_and_month_path(:year=> month.year, :month => month.month) %></h4>
以及修改我们的
posts/\u posts\u 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>
match 'posts/by_year_and_month/:year/:month' => 'posts#by_year_and_month', :as=> :posts_by_year_and_month
<h4><%= link_to "#{month.strftime('%B %Y')} (#{posts.count}):", posts_by_year_and_month_path(:year=> month.year, :month => month.month) %></h4>
month.year,:month=>month.month)%>

我总是这样分组:

@posts_by_month = Post.find(:all, :order => "created_at DESC").group_by { |post| post.created_at.beginning_of_month }
然后创建例如
posts/\u post\u 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>
match 'posts/by_year_and_month/:year/:month' => 'posts#by_year_and_month', :as=> :posts_by_year_and_month
<h4><%= link_to "#{month.strftime('%B %Y')} (#{posts.count}):", posts_by_year_and_month_path(:year=> month.year, :month => month.month) %></h4>
在您的
routes.rb中:

<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>
match 'posts/by_year_and_month/:year/:month' => 'posts#by_year_and_month', :as=> :posts_by_year_and_month
<h4><%= link_to "#{month.strftime('%B %Y')} (#{posts.count}):", posts_by_year_and_month_path(:year=> month.year, :month => month.month) %></h4>
以及修改我们的
posts/\u posts\u 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>
match 'posts/by_year_and_month/:year/:month' => 'posts#by_year_and_month', :as=> :posts_by_year_and_month
<h4><%= link_to "#{month.strftime('%B %Y')} (#{posts.count}):", posts_by_year_and_month_path(:year=> month.year, :month => month.month) %></h4>
month.year,:month=>month.month)%>
在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”、:action=>“month”、:month=>rec.month、:year=>rec.year}%>
@帖子%>
博客档案
然后将posts_控制器中的月份操作更改为接受两个参数params[:month]¶ms[:year]

希望这对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”、:action=>“month”、:month=>rec.month、:year=>rec.year}%>
@帖子%>
博客档案
然后将posts_控制器中的月份操作更改为接受两个参数params[:month]¶ms[:year]


希望这将有助于

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

希望这能帮助一些人。

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

希望这能帮助别人。

是的,这和我已经做的很相似。这提供了一个月内发布的帖子列表。我试图做的是在索引页面上创建一个名为
August
的链接,例如导航到一个页面,该页面列出了8月份的帖子。你知道怎么做吗?这个博客就是一个例子。查看归档部分的左侧。请注意月份是如何存在的,如果单击月份,它将显示该月份的帖子。这就是我试图做的。我得到了这个错误
未定义的局部变量或方法posts\u by\u year\u and \u month
抱歉在link\u中添加
\u path
posts\u by\u year\u和\u month
它应该看起来像
posts\u by\u year\u和\u month\u路径(:year=>month.year,:month=>month.month)
,答案已更新,并将“:”添加到:as=>:posts\u by\u year\u monthYeah这与我之前的内容类似。这提供了一个月内发布的帖子列表。我试图做的是在索引页面上创建一个名为
August
的链接,例如导航到一个页面,该页面列出了8月份的帖子。你知道怎么做吗?这个博客就是一个例子。查看归档部分的左侧。请注意月份是如何存在的,如果单击月份,它将显示该月份的帖子。这就是我试图做的。我得到了这个错误
未定义的局部变量或方法posts\u by\u year\u and \u month
抱歉在link\u中添加
\u path
posts\u by\u year\u和\u month
它应该看起来像
posts\u by\u year\u和\u month\u路径(:year=>month.year,:month=>month.month)
,答案已更新,并将“:”添加到:as=>:posts\u by\u year\u和\u monthI知道我以前看过你的帖子,因此我需要它。谢谢我知道我以前看过你的帖子,而我最终需要它的原因正是这个。谢谢