15

我想知道是否有人已经在 Rails 中构建了一个用于线程注释的系统(因为没有更好的术语),或者我是否需要自己构建它。

如果不清楚,我指的是像 Reddit 这样的评论系统,它会自动缩进回复,使它们看起来像树的树枝(最好像 Reddit 那样进行投票)。

如果有人能指出我这样做的代码,将不胜感激。

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

到目前为止,我还没有在 Rails 中找到一个。

另外,最好在 Rails 论坛上问这个问题,如果是这样,是哪一个?(我是 Rails 新手)

4

4 回答 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>了示例中缺少的结束标签。

于 2009-01-21T03:10:28.377 回答
1

Hector 和 Samuel 给出的 ActsAsTree 文档的链接似乎已损坏。您可以在以下位置获取文档

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

(我使用了一个 pre 标签,因为链接由于某种原因一直显示错误)。

于 2009-06-19T05:23:36.400 回答
1

有一个 has_threaded_comments gem,从未使用过它,但它看起来正是这样做的: https ://github.com/aarongough/has_threaded_comments

于 2011-02-19T00:19:17.820 回答
0

acts_as_tree在你的模型上试过插件吗?这是一个官方的 ActiveRecord 组件。

http://wiki.rubyonrails.org/rails/pages/ActsAsTree

于 2009-01-21T02:57:47.653 回答