如何在Rails视图中呈现所有注释?

时间:2009-11-23 05:55:14

标签: ruby-on-rails ruby comments blogs

我是铁杆新手,所以请轻松一点。我创建了一个博客。我已成功实施评论并将其附加到每个帖子。现在......我想在侧边栏中显示所有帖子中最新评论的列表。我认为这里涉及两件事,一个是对comment_controller.rb的更新,然后是来自实际页面的调用。这是注释控制器代码。

class CommentsController < ApplicationController

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create!(params[:comment])

    respond_to do |format|
      format.html { redirect_to @post}
      format.js
    end
  end
end

3 个答案:

答案 0 :(得分:5)

如果您想以最近的顺序显示来自任何帖子的所有评论,您可以这样做:

@comments = Comment.find(:all, :order => 'created_at DESC', :limit => 10)

在视图中你可以这样做:

<% @comments.each do |comment| -%>
    <p>
        <%= comment.text %> on the post <%= comment.post.title %>
    </p>
<% end -%>

答案 1 :(得分:4)

我发布了一个单独的答案,因为代码显然在评论中根本没有格式化。

我猜你遇到的问题与之前的答案是你正在进行

@comments = Comment.find(:all, :order => 'created_at DESC', :limit => 10)

在你的一个控制器方法中。但是,您希望@comments可用于布局文件,因此您必须将其放在每个控制器的每个控制器方法上才能使其工作。尽管在视图中放置逻辑是不受欢迎的,但我认为在布局文件中执行以下操作是可以接受的:

<% Comment.find(:all, :order => 'created_at DESC', :limit => 10).each do |comment| -%>
    <p>
        <%= comment.text %> on the post <%= comment.post.title %>
    </p>
<% end -%>

要从视图中获取一些逻辑,尽管我们可以将其移动到Comment模型

class Comment < ActiveRecord::Base
  named_scope :recent, :order => ["created_at DESC"], :limit => 10

现在您可以在视图中执行此操作:

<% Comment.recent.each do |comment| -%>
    <p>
        <%= comment.text %> on the post <%= comment.post.title %>
    </p>
<% end -%>

这样可以提供一个不错的fat model and skinny controller

答案 2 :(得分:0)

我倾向于使用帮助器:

# in app/helpers/application_helper.rb:
def sidebar_comments(force_refresh = false)
  @sidebar_comments = nil if force_refresh
  @sidebar_comments ||= Comment.find(:all, :order => 'created_at DESC', :limit => 10)
  # or ||= Comment.recent.limited(10) if you are using nifty named scopes
end

# in app/views/layouts/application.html.erb:
<div id='sidebar'>
  <ul id='recent_comments'>
    <% sidebar_comments.each do |c| %>
      <li class='comment'>
        <blockquote cite="<%= comment_path(c) -%>"><%= c.text -%></blockquote>
      </li>
    <% end %>
  </ul>
</div>