Skip to content


Instalación del plugin: acts_as_commentable

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', :o 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

Posted in Proyectos, RubyOnRails, Tips & Tricks.

Tagged with , , .

You might also like

Cómo añadir tags a nuestros modelos Estoy seguro que más de una vez habéis visto nubes de tags en variedad de sitios webs, a la vez que...
Una red social para desarrolladores: debug_mode=ON La verdad es que estos días he estado bastante en silencio, pero más por falta de tiempo que otra cosa,...
El comienzo de un nuevo proyecto: flatee.com Llevo poco tiempo, y he posteado poco en estos últimos días, sin embargo todo tiene su explicación,...
Instalación de recaptcha Si el otro día hablábamos de crear comentarios gracias al plugin acts_as_commentable, creo que convendréis...
Grab This Widget

0 Responses

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



Some HTML is OK

or, reply to this post via trackback.