Reddit estilo aninhada / rosca / recuado comentários para Rails?
-
19-08-2019 - |
Pergunta
Eu estou querendo saber se alguém já construiu um sistema para comentários rosca (por falta de um termo melhor) em Rails ou se eu preciso construí-lo.
No caso, não está claro, o que eu estou me referindo é um sistema de comentário como Reddit do que automaticamente travessões respostas para que eles apareçam como galhos de uma árvore (de preferência com a votação, assim como Reddit faz).
Se alguém pudesse me aponte para o código que faz isso, ele seria muito apreciada.
Ou talvez haja um projeto open source que inclui esta funcionalidade.
Até agora eu não tenho sido capaz de encontrar um em Rails.
Além disso, seria melhor perguntar isso em um fórum Rails e, em caso afirmativo, qual? (Eu sou novo para Rails)
Solução
Usando o acts_as_tree
plug-in deve fazer isso bastante fácil de implementar. Instalá-lo 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>
A magia acontece em show.html.erb
quando ele chama <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>
, isso fará com que a parcial para tornar recursivamente todos os filhos comentários. Se você quiser um limite para a profundidade, você pode fazê-lo na parcial ou no modelo.
Editar:
Isso vai deixar você com todos os comentários com o mesmo espaçamento no HTML para cada profundidade. Se você quiser produzir fácil de ler HTML, basta usar render(...).gsub(/^/, "\t")
isso vai funcionar de forma recursiva, assim produzindo HTML bem recuado.
Eu combinei-lo em meu próprio método em app/helpers/application_helper.rb
def indented_render(num, *args)
render(*args).gsub(/^/, "\t" * num)
end
Então, agora você pode chamar <%= indented_render 1, :partial => 'comments/comment', ... %>
Editar:
Corrigido faltando fechar tag </h1>
no exemplo.
Outras dicas
Os links para a documentação ActsAsTree como dadas por Hector e Samuel parece estar quebrado. Você pode obter os documentos em
http://web.archive.org/web/20061011101510/http://wiki.rubyonrails.org/rails/pages/ActsAsTree
(eu usei a tag pre como o errado exibindo manteve ligado por algum motivo).
Não é uma jóia has_threaded_comments, nunca usei, mas parece que ele faz exatamente isso: https://github.com/aarongough/has_threaded_comments
Você tentou acts_as_tree
plugin em seu modelo?
É um componente oficial ActiveRecord.