2009-01-21 18 views
14

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.Comentarios anidados/enhebrados/enhebrados estilo Reddit para Rails?

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

Si alguien me puede indicar un 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, en caso afirmativo, cuál? (Soy nuevo en Rails)

Respuesta

40

Usando el plugin acts_as_tree debe hacer esta 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 sucede en show.html.erb cuando llama <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>, esto hará que el parcial para rendir de forma recursiva 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 le dejará con todos los comentarios con la misma separación en el código HTML para cada profundidad. Si desea producir HTML fácil de leer, solo use render(...).gsub(/^/, "\t"), esto funcionará de manera recursiva y producirá HTML con sangría.

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

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

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

Editar:
fijo falta cerrar </h1> etiqueta en el ejemplo.

+1

ahora que es una respuesta! – srboisvert

+0

Creo que te falta una h1 de cierre en el título de comentario. Aparte de eso, ¡respuesta increíble! ¡Gracias! :) – hsribei

+0

¡Santa vaca! ¡Gran respuesta! Esto realmente me ayudó con un proyecto. Nunca pensé en usar acts_as_tree. – CalebHC

1

Los enlaces a la documentación de ActsAsTree tal como aparecen en Hector y Samuel parecen estar rotos. Usted puede obtener la documentación en

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

(utilicé una etiqueta pre como el ligado mantenido mostrando mal por alguna razón).

Cuestiones relacionadas