megadownload mega links downloads 1080p ruby-on-rails reddit threaded-comments acts-as-tree

ruby-on-rails - mega - reddit links



¿Comentarios de Reddit anidados/roscados/sangrados para Rails? (4)

¿Has probado el plugin acts_as_tree en tu modelo? Es un componente oficial de ActiveRecord.

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

Me pregunto si alguien ya ha creado un sistema para comentarios enhebrados (por falta de un término mejor) en Rails o si necesito construirlo yo mismo.

En caso de que no esté claro, me refiero a un sistema de comentarios como el de Reddit que sangra automáticamente las respuestas para que aparezcan como ramas de un árbol (preferiblemente con votación como lo hace Reddit).

Si alguien pudiera indicarme el código que hace esto, sería muy apreciado.

O tal vez hay un proyecto de código abierto que incluye esta funcionalidad.

Hasta ahora no he podido encontrar uno en Rails.

Además, ¿sería mejor preguntar esto en un foro de Rails y, de ser así, cuál? (Soy nuevo en Rails)


Los enlaces a la documentación de ActsAsTree que Hector y Samuel proporcionan parecen estar rotos. Puede obtener los documentos en

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

(Utilicé una etiqueta previa ya que los enlaces seguían mostrando errores por alguna razón).



Usar el plugin acts_as_tree debería hacer esto bastante fácil de implementar. Instalarlo usando

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 magia ocurre en show.html.erb cuando llama a <%= render :partial => ''comments/comment'', :object => Comment.find(params[:id]) %> show.html.erb <%= render :partial => ''comments/comment'', :object => Comment.find(params[:id]) %> , esto hará que el parcial sea recursivo hacer todos los comentarios de los niños. Si quieres un límite a la profundidad, puedes hacerlo en el parcial o en el modelo.

Editar:
Esto te dejará con todos los comentarios con el mismo espacio en el HTML para cada profundidad. Si desea producir HTML fácil de leer, solo use render(...).gsub(/^/, "/t") esto funcionará de forma recursiva y producirá HTML con sangría.

Lo combiné en mi propio método en la app/helpers/application_helper.rb

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

Así que ahora puedes llamar a <%= indented_render 1, :partial => ''comments/comment'', ... %>

Editar:
Se </h1> etiqueta de cierre faltante </h1> en el ejemplo.