Este fin de semana he retomado mi idea de crear una herramienta para blogs, pero tenía la intención de hacer uso de la mayor cantidad posible de plugins que pudiese, para así poder experimentar con ellos. Cualquier blog que guste de hacer uso del feedback y de las opiniones de la gente, cuenta con un sistema que permite comentar las entradas que se hacen en el mismo. Pues bien, para hacer esto, podríamos crearnos el modelo que lo contendría, establecer la relación, validar las entradas, etc. Sin embargo existe un plugin, acts_as_commentable, que podría simplificarnos esta labor.
Para poder comentar nuestras entradas, vamos a generar un scaffold llamado Entry:
script/generate scaffold Entry title:string body:text create_at:datetime draft:boolean
Empezamos por instalar el plugin:
script/plugin install http://juixe.com/svn/acts_as_commentable
Necesitamos crear una migración para contener la tabla de comentarios, dado que el plugin no la crea por nosotros:
script/generate migration create_comments
Esto nos genera un fichero en db/migrate cuyo nombre es XXX_create_comments.rb; XXX es un número, que dependerá de nuestro contenido en el directorio anterior, en mi caso es 002_create_comments.rb, el contenido que debemos copiar en dicho fichero es:
class CreateComments < ActiveRecord::Migration
def self.up
create_table :comments, :force => true do |t|
t.column :author, :string, :limit => 50, :default => ""
t.column :email, :string, :limit => 100, :default => ""
t.column :website, :string, :limit => 100, :default => ""
t.column :body, :text, :default => ""
t.column :created_at, :datetime, :null => false
t.column :commentable_id, :integer, :default => 0, :null => false
t.column :commentable_type, :string, :limit => 15, :default => "", :null => false
t.column :user_id, :integer, :default => 0, :null => false
end
add_index :comments, ["user_id"], :name => "fk_comments_user"
end
def self.down
drop_table :comments
end
end
ejecutamos el proceso de migración, para poder empezar a usar la tabla:
rake db:migrate
Para que nuestro modelo Entry empieze a ser comentable, necesitamos añadirle lo siguiente:
class Entry < ActiveRecord::Base acts_as_commentable end
A partir de este momento, tenemos todo listo. Aunque ahora necesitamos utilizarlo, para ello, primero cambiamos la vista de las entradas para que puedan ser comentadas cuando las estemos viendo. Así que modificamos el fichero entries/show.html.erb, y añadimos:
<%= render :partial => 'comment',bject => @entries %>
Creamos el fichero _comment.html.erb:
Comments
<% if @entry.comments.count != 0%>
<% for comment in @entry.comments %>
<%= comment.author%> said <%= distance_of_time_in_words(Time.now,comment.created_at) %>.
<%= comment.body %>
<% end %>
<% end %>
<%= form_tag :action => "comment", :id => @entry do %>
<%= text_field 'comment', 'author' %> name (required)
<%= text_field 'comment', 'email' %> email ( will not be shown ) (required)
<%= text_field 'comment', 'website' %> website
<%= text_area "comment", "body" %>
<%= submit_tag "Comment!" %>
<%= end_tag %>
(falta añadir los saltos de línea correspondientes)
comment:
def comment
@entry = Entry.find(params[:id])
comment = Comment.new(params[:comment])
@entry.add_comment comment
comment.save!
Commentmailer.deliver_comment(comment)
flash[:notice] = "Comentario añadido con éxito"
redirect_to :action => 'show'
end
La creación del comentario es recogiendo los parámetros del formulario, aunque la parte importante es cómo manejar los comentarios, cómo añadírselo a una entrada:
@entry.add_comment comment
Si os habéis fijado, la tabla añade una columna user_id, de esta forma tenemos asociados los comentarios a los usuarios. De tal forma que podremos hacer búsquedas como:
comments = Comment.find_comments_by_user(user)
De tal forma que obtendríamos todos los comentarios para un usuario dado. O podríamos obtener los comentarios de un usuario para las entradas:
postComments = Entry.find_comments_by_user(user)
Por si os entra la vena investidadora, os diré que en la tabla hay un par de columnas “mágicas” que crean la relación con los distintos modelos que quisieramos comentar:
commentable_id >> almacena el identificador de lo que comentemos
commentable_type >> almacena el tipo de lo que comentemos, en nuestro caso Entry


0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.