Rails的Reddit样式嵌套/线程/缩进注释?

时间:2009-01-21 02:34:15

标签: ruby-on-rails reddit threaded-comments acts-as-tree

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

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

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

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

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

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

4 个答案:

答案 0 :(得分: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]) %>时,神奇发生在render(...).gsub(/^/, "\t"),这将导致部分递归渲染所有子注释。如果您想要深度限制,可以在部分或模型中进行。

修改
这将为您提供HTML中每个深度的相同间距的所有注释。如果你想生成易于阅读的HTML,只需使用app/helpers/application_helper.rb,这将递归地工作,同时生成很好的缩进HTML。

我在def indented_render(num, *args) render(*args).gsub(/^/, "\t" * num) end

中将它合并到我自己的方法中
<%= indented_render 1, :partial => 'comments/comment', ... %>

现在您可以致电</h1>

修改
修复了示例中缺少结束{{1}}标记的问题。

答案 1 :(得分:1)

Hector和Samuel给出的ActsAsTree文档的链接似乎被打破了。您可以在

获取文档
 
http://web.archive.org/web/20061011101510/http://wiki.rubyonrails.org/rails/pages/ActsAsTree

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

答案 2 :(得分:1)

有一个has_threaded_comments gem,从未使用它,但看起来它确实如此: https://github.com/aarongough/has_threaded_comments

答案 3 :(得分:0)

您是否在模型上尝试了acts_as_tree插件? 这是一个官方的ActiveRecord组件。

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