我想知道是否有人已经在 Rails 中构建了一个用于线程注释的系统(因为没有更好的术语),或者我是否需要自己构建它。
如果不清楚,我指的是像 Reddit 这样的评论系统,它会自动缩进回复,使它们看起来像树的树枝(最好像 Reddit 那样进行投票)。
如果有人能指出我这样做的代码,将不胜感激。
或者也许有一个包含此功能的开源项目。
到目前为止,我还没有在 Rails 中找到一个。
另外,最好在 Rails 论坛上问这个问题,如果是这样,是哪一个?(我是 Rails 新手)
我想知道是否有人已经在 Rails 中构建了一个用于线程注释的系统(因为没有更好的术语),或者我是否需要自己构建它。
如果不清楚,我指的是像 Reddit 这样的评论系统,它会自动缩进回复,使它们看起来像树的树枝(最好像 Reddit 那样进行投票)。
如果有人能指出我这样做的代码,将不胜感激。
或者也许有一个包含此功能的开源项目。
到目前为止,我还没有在 Rails 中找到一个。
另外,最好在 Rails 论坛上问这个问题,如果是这样,是哪一个?(我是 Rails 新手)
使用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>
了示例中缺少的结束标签。
Hector 和 Samuel 给出的 ActsAsTree 文档的链接似乎已损坏。您可以在以下位置获取文档
http://web.archive.org/web/20061011101510/http://wiki.rubyonrails.org/rails/pages/ActsAsTree
(我使用了一个 pre 标签,因为链接由于某种原因一直显示错误)。
有一个 has_threaded_comments gem,从未使用过它,但它看起来正是这样做的: https ://github.com/aarongough/has_threaded_comments
你acts_as_tree
在你的模型上试过插件吗?这是一个官方的 ActiveRecord 组件。