Rails的Reddit样式嵌套/线程/缩进注释?
我想知道是否有人已经在Rails中构建了一个用于线程注释的系统(缺少更好的术语),或者我是否需要自己构建它。
如果不清楚,我所指的是像Reddit这样的评论系统会自动缩进回复,使它们看起来像一棵树的分支(最好像Reddit一样进行投票)。
如果有人能指出我这样做的代码,我将不胜感激。
或者也许有一个包含此function的开源项目。
到目前为止,我还没能在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
<%= comment.title %>
<%= comment.content %> <%= render :partial => 'comments/comment', :collection => comments.children %>
app/views/comments/show.html.erb
<%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>
当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', ... %>
编辑:
修复了示例中缺少关闭标记的问题。
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组件。