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.
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).
Hay una gema has_threaded_comments, nunca la usé, pero parece que hace exactamente esto: https://github.com/aarongough/has_threaded_comments
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.