5

嘿伙计们。我创建了一个带有常用 CRUD 操作的简单博客应用程序。我还在 PostController 中添加了一个名为“归档”的新操作和一个关联的视图。在这个视图中,我想带回所有博客文章并按月对它们进行分组,以这种格式显示它们:

March
<ul>
    <li>Hello World</li>
    <li>Blah blah</li>
    <li>Nothing to see here</li>
    <li>Test post...</li>
</ul>

Febuary
<ul>
    <li>My hangover sucks</li>
    ... etc ...

我无法为我的生活找出最好的方法来做到这一点。假设 Post 模型具有通常title的 ,contentcreated_at字段,有人可以帮我解决逻辑/代码吗?我对 RoR 很陌生,所以请多多包涵:)

4

2 回答 2

31

group_by 是一个很好的方法:

控制器:

def archive
  #this will return a hash in which the month names are the keys, 
  #and the values are arrays of the posts belonging to such months
  #something like: 
  #{ "February" => [#<Post 0xb5c836a0>,#<Post 0xb5443a0>],
  # 'March' => [#<Post 0x43443a0>] }
  @posts_by_month = Posts.find(:all).group_by { |post| post.created_at.strftime("%B") }
end

查看模板:

<% @posts_by_month.each do |monthname, posts| %>
<%= monthname %>
<ul>
   <% posts.each do |post| %>
     <li><%= post.title %></li>
   <% end %>
</ul>
<% end %>
于 2009-07-03T19:46:51.407 回答
7

@马克西米利亚诺·古兹曼

好答案!感谢您为 Rails 社区增加价值。我在How to Create a Blog Archive with Rails中包含了我的原始资料,以防我破坏作者的推理。根据博文,对于 Rails 的新开发人员,我要添加一些建议。

首先,使用 Active Records Posts.all方法返回 Post 结果集以提高速度和互操作性。已知Posts.find(:all)方法存在不可预见的问题。

最后,同样地,使用ActiveRecord 核心扩展中的begin_of_month方法。我发现begin_of_monthstrftime("%B")更具可读性。当然,选择权在你。

以下是这些建议的示例。请参阅原始博客文章以获取更多详细信息:

控制器/archives_controller.rb

def index
    @posts = Post.all(:select => "title, id, posted_at", :order => "posted_at DESC")
    @post_months = @posts.group_by { |t| t.posted_at.beginning_of_month }
end

意见/档案/indext.html.erb

<div class="archives">
    <h2>Blog Archive</h2>

    <% @post_months.sort.reverse.each do |month, posts| %>
    <h3><%=h month.strftime("%B %Y") %></h3>
    <ul>
        <% for post in posts %>
        <li><%=h link_to post.title, post_path(post) %></li>
        <% end %>
    </ul>
    <% end %>
</div>

祝你好运,欢迎来到 Rails!

于 2010-10-17T04:50:31.730 回答