Reddit-стиль вложенных/поточных/отступов для Rails?

Мне интересно, если кто-то уже создал систему для потоковых комментариев (из-за отсутствия лучшего термина) в Rails или если мне нужно ее самостоятельно создать.

В случае, если это неясно, я имею в виду систему комментариев, такую ​​как Reddit, которая автоматически дает отступы, чтобы они отображались как ветки дерева (желательно с голосованием, как это делает Reddit).

Если кто-то может указать мне на код, который сделает это, мы будем очень благодарны.

Или, возможно, есть проект с открытым исходным кодом, который включает эту функциональность.

До сих пор я не смог найти его в Rails.

Кроме того, было бы лучше спросить об этом на форуме Rails и, если да, то какой? (Я новичок в Rails)

Ответы

Ответ 1

Использование плагина 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> в этом примере.

Ответ 2

Ссылки на документацию ActsAsTree, приведенные Гектором и Самуэлем, кажутся нарушенными. Вы можете получить документы в

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

(Я использовал предварительный тег, потому что по какой-то причине ссылка отображалась неправильно).