Frage

Ich frage mich, wenn jemand bereits ein System für Gewinde Kommentare (mangels eines besseren Begriffs) in Rails gebaut hat, oder wenn ich brauche, es selbst zu bauen.

Falls es nicht klar ist, was ich mich beziehe ist ein Kommentarsystem wie Reddit ist, das automatisch Antworten einrückt, so dass sie wie Äste eines Baumes erscheinen (vorzugsweise mit Ihrer Stimme wie Reddit tut).

Wenn jemand mich Code zeigen könnte, dass dies der Fall ist, wäre es sehr zu schätzen.

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

Bisher habe ich nicht in der Lage gewesen, einen in Rails zu finden.

Auch wäre es besser, dieses Forum auf Rails zu stellen und, wenn ja, welche? (Ich bin neu in Rails)

War es hilfreich?

Lösung

Mit der acts_as_tree Plugin sollte dies recht 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]) %> aufruft, wird dies die teilweise dazu führen, rekursiv alle Kinder Kommentare zu machen. Wenn Sie eine Grenze für die Tiefe möchten, können Sie es in den teilweisen oder im Modell tun.

Bearbeiten
Dadurch werden Sie mit all den Kommentaren mit dem gleichen Abstand in dem HTML-Code für jede Tiefe verlassen. Wenn Sie einfach produzieren wollen HTML zu lesen, benutzen Sie einfach render(...).gsub(/^/, "\t") dies wird rekursiv so gut funktionieren gut gegliederte HTML zu erzeugen.

I kombiniert sie in meine eigene Methode in app/helpers/application_helper.rb

def indented_render(num, *args)
  render(*args).gsub(/^/, "\t" * num)
end

So, jetzt können Sie <%= indented_render 1, :partial => 'comments/comment', ... %> nennen

Bearbeiten
Fest fehlender Abschluss </h1> Tag im Beispiel.

Andere Tipps

Die Links zu der ActsAsTree Dokumentation von Hector und Samuel gegeben scheinen gebrochen zu werden. Sie können die Dokumente an

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

(habe ich eine Pre-Tag als die aus irgendeinem Grund falsch verknüpft gehalten Anzeige).

Es gibt ein has_threaded_comments Juwel, es nie benutzt, aber es sieht aus wie es tut genau dies: https://github.com/aarongough/has_threaded_comments

Bitte benutzen Sie acts_as_tree Plugin auf Ihrem Modell versucht? Es ist eine offizielle Active Komponente.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top