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)

Foi útil?

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.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top