Utiliser le plugin acts_as_tree
devrait en faire assez facile à mettre en œuvre. Installez-le à l'aide
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>
La magie se produit dans show.html.erb
quand il appelle <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>
, cela entraînera la partielle récursive tous les commentaires render enfants. Si vous voulez une limite à la profondeur, vous pouvez le faire dans le partiel ou dans le modèle.
Edit:
Cela vous laissera avec tous les commentaires avec le même espacement dans le code HTML pour chaque profondeur. Si vous voulez produire du HTML facile à lire, il suffit d'utiliser render(...).gsub(/^/, "\t")
cela fonctionnera de manière récursive et produira du HTML bien découpé.
Je l'ai combiné dans ma propre méthode app/helpers/application_helper.rb
def indented_render(num, *args)
render(*args).gsub(/^/, "\t" * num)
end
Alors maintenant, vous pouvez appeler <%= indented_render 1, :partial => 'comments/comment', ... %>
Edit:
fixe manquant balise de fermeture </h1>
dans l'exemple.
maintenant est une réponse! – srboisvert
Je crois qu'il vous manque un h1 de fermeture dans le titre du commentaire. Autre que cela, réponse géniale! Merci! :) – hsribei
Vache sacrée! Très bonne réponse! Cela m'a vraiment aidé avec un projet. Je n'ai jamais pensé à utiliser acts_as_tree. – CalebHC