我想知道是否有人已经在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]) %>
时,神奇的事情发生了,这将导致局部视图递归地呈现所有子评论。如果您想限制深度,请在局部视图或模型中完成。
编辑: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>
。
有一个名为 has_threaded_comments 的宝石,我从未使用过,但看起来它正好可以做到这一点: https://github.com/aarongough/has_threaded_comments
Hector和Samuel提供的ActsAsTree文档链接似乎已经失效。你可以在以下网址获取文档:
http://web.archive.org/web/20061011101510/http://wiki.rubyonrails.org/rails/pages/ActsAsTree
我使用了pre标签,因为链接出现错误的原因。
acts_as_tree
插件吗?它是一个官方的ActiveRecord组件。