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.
ahora que es una respuesta! – srboisvert
Creo que te falta una h1 de cierre en el título de comentario. Aparte de eso, ¡respuesta increíble! ¡Gracias! :) – hsribei
¡Santa vaca! ¡Gran respuesta! Esto realmente me ayudó con un proyecto. Nunca pensé en usar acts_as_tree. – CalebHC