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