Вопрос

Мне интересно, создал ли кто-нибудь уже систему цепочек комментариев (из-за отсутствия лучшего термина) в 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> тег в примере.

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top