Reddit-Stil geschachtelt / Gewinde / eingekerbten Kommentare für Rails?
-
19-08-2019 - |
Frage
Ich frage mich, wenn jemand bereits ein System für Gewinde Kommentare (mangels eines besseren Begriffs) in Rails gebaut hat, oder wenn ich brauche, es selbst zu bauen.
Falls es nicht klar ist, was ich mich beziehe ist ein Kommentarsystem wie Reddit ist, das automatisch Antworten einrückt, so dass sie wie Äste eines Baumes erscheinen (vorzugsweise mit Ihrer Stimme wie Reddit tut).
Wenn jemand mich Code zeigen könnte, dass dies der Fall ist, wäre es sehr zu schätzen.
Oder vielleicht gibt es ein Open-Source-Projekt, das diese Funktionalität umfasst.
Bisher habe ich nicht in der Lage gewesen, einen in Rails zu finden.
Auch wäre es besser, dieses Forum auf Rails zu stellen und, wenn ja, welche? (Ich bin neu in Rails)
Lösung
Mit der acts_as_tree
Plugin sollte dies recht einfach machen zu implementieren. Installieren Sie es mit
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>
Die Magie geschieht in show.html.erb
wenn es <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>
aufruft, wird dies die teilweise dazu führen, rekursiv alle Kinder Kommentare zu machen. Wenn Sie eine Grenze für die Tiefe möchten, können Sie es in den teilweisen oder im Modell tun.
Bearbeiten
Dadurch werden Sie mit all den Kommentaren mit dem gleichen Abstand in dem HTML-Code für jede Tiefe verlassen. Wenn Sie einfach produzieren wollen HTML zu lesen, benutzen Sie einfach render(...).gsub(/^/, "\t")
dies wird rekursiv so gut funktionieren gut gegliederte HTML zu erzeugen.
I kombiniert sie in meine eigene Methode in app/helpers/application_helper.rb
def indented_render(num, *args)
render(*args).gsub(/^/, "\t" * num)
end
So, jetzt können Sie <%= indented_render 1, :partial => 'comments/comment', ... %>
nennen
Bearbeiten
Fest fehlender Abschluss </h1>
Tag im Beispiel.
Andere Tipps
Die Links zu der ActsAsTree Dokumentation von Hector und Samuel gegeben scheinen gebrochen zu werden. Sie können die Dokumente an
erhaltenhttp://web.archive.org/web/20061011101510/http://wiki.rubyonrails.org/rails/pages/ActsAsTree
(habe ich eine Pre-Tag als die aus irgendeinem Grund falsch verknüpft gehalten Anzeige).
Es gibt ein has_threaded_comments Juwel, es nie benutzt, aber es sieht aus wie es tut genau dies: https://github.com/aarongough/has_threaded_comments
Bitte benutzen Sie acts_as_tree
Plugin auf Ihrem Modell versucht?
Es ist eine offizielle Active Komponente.