2009-01-21 10 views
14

Ich frage mich, ob jemand bereits ein System für Thread-Kommentare (aus Mangel an einem besseren Begriff) in Rails erstellt hat oder wenn ich es selbst erstellen muss.Reddit-Stil verschachtelte/Gewinde/eingerückt Kommentare für Rails?

Wenn es nicht klar ist, was ich meine, ist ein Kommentar-System wie Reddit, das Antworten automatisch einfügt, so dass sie wie Äste eines Baumes erscheinen (vorzugsweise mit Voting, wie Reddit).

Wenn jemand mich auf Code verweisen könnte, der dies tut, würde es sehr geschätzt werden.

Oder vielleicht gibt es ein Open-Source-Projekt, das diese Funktionalität enthält.

Bisher konnte ich keinen in Rails finden.

Auch wäre es besser, dies in einem Rails-Forum zu fragen, und wenn ja, welches? (Ich bin neu in Rails)

Antwort

40

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.

+1

jetzt, dass eine Antwort! – srboisvert

+0

Ich glaube, dass Sie eine abschließende h1 im Kommentartitel fehlt. Ansonsten eine tolle Antwort! Vielen Dank! :) – hsribei

+0

Heilige Kuh! Gute Antwort! Das hat mir bei einem Projekt sehr geholfen. Ich habe nie darüber nachgedacht, acts_as_tree zu verwenden. – CalebHC

1

Die Links zu der ActsAsTree-Dokumentation, die von Hector und Samuel gegeben wurde, scheinen gebrochen zu sein. Sie können die Dokumentation unter

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

bekommen (Ich verwendete ein Pre-Tag als die verknüpfte Anzeige aus irgendeinem Grund falsch angezeigt).