2009-01-21 4 views
14

Je me demande si quelqu'un a déjà construit un système pour les commentaires threads (faute d'un meilleur terme) dans Rails ou si j'ai besoin de le construire moi-même. Dans le cas où ce n'est pas clair, je parle d'un système de commentaire comme Reddit qui indente automatiquement les réponses pour qu'elles apparaissent comme des branches d'un arbre (de préférence avec un vote comme Reddit).commentaires imbriqués/threaded/indentés de style Reddit pour Rails?

Si quelqu'un pouvait me diriger vers un code qui le ferait, ce serait grandement apprécié.

Ou peut-être qu'il existe un projet open source qui inclut cette fonctionnalité.

Jusqu'à présent, je n'ai pas réussi à en trouver un dans Rails.

Aussi, serait-il préférable de demander cela sur un forum Rails et, si oui, lequel? (Je suis nouveau à Rails)

Répondre

40

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.

+1

maintenant est une réponse! – srboisvert

+0

Je crois qu'il vous manque un h1 de fermeture dans le titre du commentaire. Autre que cela, réponse géniale! Merci! :) – hsribei

+0

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

1

Les liens vers la documentation ActsAsTree donnée par Hector et Samuel semblent être cassé. Vous pouvez obtenir les documents à

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

(J'ai utilisé un pré-tag comme l'affichage maintenu lié mal pour une raison quelconque).

Questions connexes