为Rails实现类似于Reddit的嵌套/线程/缩进评论?

15

我想知道是否有人已经在Rails中构建了线程评论系统(缺乏更好的术语),还是我需要自己构建它。

如果不清楚,我指的是像Reddit那样的评论系统,自动缩进回复,使其看起来像树的分支(最好像Reddit一样带有投票功能)。

如果有人可以指点我代码,我将不胜感激。

或者也许有一个开源项目包括此功能。

到目前为止,我在Rails中还没有找到这样的功能。

另外,是否更好地在Rails论坛上询问,如果是,哪个论坛?(我是Rails新手)

4个回答

40
使用acts_as_tree插件可以很容易地实现这一点。使用以下命令进行安装:ruby script/plugin install acts_as_tree。在app/models/comment.rb文件中实现即可。
class Comment < ActiveRecord::Base
  acts_as_tree :order => 'created_at'
end

db/migrate/20090121025349_create_comments.rb

class CreateComments < ActiveRecord::Migration
  def self.up
    create_table :comments do |t|
      t.references :parent
      t.string :title
      t.text :content
      ...
      t.timestamps
    end
  end

  def self.down
    drop_table :comments
  end
end

app/views/comments/_comment.html.erb

<div id="comment_<%= comment.id %>">
  <h1><%= comment.title %></h1>
  <%= comment.content %>
  <%= render :partial => 'comments/comment', :collection => comments.children %>
</div>

app/views/comments/show.html.erb

<div id="comments">
  <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>
</div>

show.html.erb调用<%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>时,神奇的事情发生了,这将导致局部视图递归地呈现所有子评论。如果您想限制深度,请在局部视图或模型中完成。 编辑:
这将使每个深度的HTML中所有注释具有相同的间距。如果您想生成易于阅读的HTML,请使用render(...).gsub(/^/, "\t"),这也将递归地工作,生成漂亮的缩进HTML。
我将其合并到自己的方法中:app/helpers/application_helper.rb
def indented_render(num, *args)
  render(*args).gsub(/^/, "\t" * num)
end

现在你可以调用 <%= indented_render 1, :partial => 'comments/comment', ... %>

编辑:
修复示例中缺少的闭合标签</h1>


我相信您在评论标题中漏掉了一个闭合的h1标签。除此之外,答案非常棒!谢谢! :) - agentofuser
哇塞!太棒了!这个答案真的帮助了我完成一个项目。我从来没有想过使用acts_as_tree。 - CalebHC
我正在尝试使用acts_as_tree,但无法使indented_render工作。我正在做的是这个。我做错了什么? - David
当您尝试获取评论时,会创建多少个SQL语句?这种方法可扩展吗? - Razor Storm

1

1

Hector和Samuel提供的ActsAsTree文档链接似乎已经失效。你可以在以下网址获取文档:

 
http://web.archive.org/web/20061011101510/http://wiki.rubyonrails.org/rails/pages/ActsAsTree

我使用了pre标签,因为链接出现错误的原因。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接