Вложенные / пронизанные / отступленные комментарии в стиле Reddit для Rails? - PullRequest
14 голосов
/ 21 января 2009

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

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

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

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

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

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

Ответы [ 4 ]

40 голосов
/ 21 января 2009

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

1 голос
/ 19 февраля 2011

Существует гем has_threaded_comments, он никогда не использовался, но, похоже, он делает именно это: https://github.com/aarongough/has_threaded_comments

1 голос
/ 19 июня 2009

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

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

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

0 голосов
/ 21 января 2009

Вы пробовали acts_as_tree плагин на вашей модели? Это официальный компонент ActiveRecord.

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

...