Question

Je me demande si quelqu'un a déjà construit un système de commentaires filetés (faute d'un meilleur terme) dans Rails ou si j'ai besoin de le construire moi-même.

Au cas où ce ne serait pas clair, je fais référence à un système de commentaires comme Reddit, qui met automatiquement en retrait les réponses afin qu’elles apparaissent comme des branches d’un arbre (de préférence avec un vote identique à celui de Reddit).

Si quelqu'un pouvait m'indiquer un code qui fait cela, ce serait grandement apprécié.

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

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

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

Était-ce utile?

La solution

L'utilisation du plug-in acts_as_tree devrait faciliter la mise en œuvre. Installez-le avec

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 passe dans show.html.erb quand il appelle <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>, le partiel rendra récursivement tous les commentaires enfants. Si vous voulez limiter la profondeur, vous pouvez le faire dans le partiel ou dans le modèle.

Modifier:
Cela vous laissera tous les commentaires avec le même espacement dans le code HTML pour chaque profondeur. Si vous voulez produire du HTML facile à lire, utilisez simplement render(...).gsub(/^/, "\t") Cela fonctionnera également de manière récursive et produira du HTML bien en retrait.

Je l'ai combiné dans ma propre méthode dans 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', ... %>

Modifier:
Correction de la balise de fermeture manquante </h1> dans l'exemple.

Autres conseils

Les liens vers la documentation ActsAsTree fournis par Hector et Samuel semblent rompus. Vous pouvez obtenir la documentation à

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

(J'ai utilisé une balise pré car le lien restait mal affiché pour une raison quelconque).

Il existe un joyau has_threaded_comments que vous n’avez jamais utilisé, mais qui ressemble à cela: https://github.com/aarongough/has_threaded_comments

Avez-vous essayé le plugin acts_as_tree sur votre modèle? C'est un composant officiel d'ActiveRecord.

http://wiki.rubyonrails.org/rails/pages/ActsAsTree

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top