das acts_as_tree
Plugin verwenden sollte dies ziemlich 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]) %>
nennt, wird dies der Teil dazu führen, rekursiv alle Kinder Kommentare zu machen. Wenn Sie eine Grenze für die Tiefe möchten, können Sie dies im partiellen oder im Modell tun.
Edit:
Diese Sie mit allen Kommentaren mit dem gleichen Abstand in der HTML-Code für jede Tiefe verlassen wird. Wenn Sie einfach lesbaren HTML-Code produzieren möchten, verwenden Sie einfach render(...).gsub(/^/, "\t")
. Dies funktioniert rekursiv und erzeugt gut eingerücktes HTML.
I kombiniert sie in meine eigene Methode in app/helpers/application_helper.rb
def indented_render(num, *args)
render(*args).gsub(/^/, "\t" * num)
end
Sie also jetzt <%= indented_render 1, :partial => 'comments/comment', ... %>
bearbeiten anrufen:
Fest fehlt Schließen </h1>
Tag im Beispiel.
jetzt, dass eine Antwort! – srboisvert
Ich glaube, dass Sie eine abschließende h1 im Kommentartitel fehlt. Ansonsten eine tolle Antwort! Vielen Dank! :) – hsribei
Heilige Kuh! Gute Antwort! Das hat mir bei einem Projekt sehr geholfen. Ich habe nie darüber nachgedacht, acts_as_tree zu verwenden. – CalebHC