我是铁杆新手,所以请轻松一点。我创建了一个博客。我已成功实施评论并将其附加到每个帖子。现在......我想在侧边栏中显示所有帖子中最新评论的列表。我认为这里涉及两件事,一个是对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
答案 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>