Desde luego una de las mayores ventajas de Rails es la existencia de los plugins y gemas que nos permiten no comernos la cabeza con cosas repetitivas, pesadas o simplemente no tener que reinventar la rueda.
En esta caso tenia que hacer un sistema para puntuar cosas con las típicas estrellítas que podemos ver en YouTube o en otras tantas webs de hoy en día. Finalmente lo conseguí, eso si gracias al plugin act_as_rateable, los gráficos de Komodomedia y la pequeña guía de Naffis.
La mayor diferencia entre la guía de Naffis y los pasos que yo pondré aquí es que aquí te enseñaré a sacarle toda la potencia pudiendo hacer el sistema polimórfico.
Advierto que a menos que estés interesado no sigas leyendo porque es un autentico ladrillo, eso si, el resultado es muy bonito
Lo primero es instalar el plugin act_as_rateable con:
-
script/plugin install http://juixe.com/svn/acts_as_rateable
Hecho esto tendremos que crear una migración con los campos necesarios para nuestro sistema de rating, en un archivo como “db/migrate/xxx_create_ratings.rb” escribimos:
-
class CreateRatings< ActiveRecord::Migration
-
-
def self.up
-
create_table :ratings, :force => true do |t|
-
t.column :rating, :integer, :default => 0
-
t.column :created_at, :datetime, :null => false
-
t.column :rateable_type, :string, :limit => 15,
-
:default => "", :null => false
-
t.column :rateable_id, :integer, :default => 0, :null => false
-
t.column :user_id, :integer, :default => 0, :null => false
-
end
-
-
add_index :ratings, ["user_id"], :name => "fk_ratings_user"
-
end
-
-
def self.down
-
drop_table :ratings
-
end
-
-
end
Realizamos la migración:
-
rake migrate
Creamos el controlador que se encargue nuestros ratings en “rating_controller.rb” por ejemplo:
-
class RatingController < ApplicationController
-
def rate
-
rateable_type = params[:rateable_type]
-
@asset = eval(rateable_type).find(params[:id])
-
Rating.delete_all(["rateable_type = ? AND rateable_id = ? AND user_id = ?", rateable_type, @asset.id, current_user.id])
-
@asset.add_rating Rating.new(:rating => params[:rating], :user_id => current_user.id)
-
end
-
end
Ya falta menos, ahora debemos generar las vistas de nuestro rating, creamos la carpeta “rating” en “views” y dentro de el creamos dos archivos:
_rating.html.erb
-
.star-rating {
-
list-style: none;
-
margin: 0px;
-
padding: 0px;
-
width: 125px;
-
height: 25px;
-
position: relative;
-
background: url(/images/star.gif) top left repeat-x; }
-
.star-rating li {
-
padding: 0px;
-
margin: 0px;
-
float: left; }
-
.star-rating li a {
-
display: block;
-
width: 25px;
-
height: 25px;
-
text-decoration: none;
-
text-indent: -9000px;
-
z-index: 20;
-
position: absolute;
-
padding: 0px; }
-
.star-rating li a:hover {
-
background: url(/images/star.gif) left center;
-
z-index: 2;
-
left: 0px;
-
border: none; }
-
.star-rating li.current-rating {
-
background: url(/images/star.gif) left bottom;
-
position: absolute;
-
height: 25px;
-
display: block;
-
text-indent: -9000px;
-
z-index: 1; }
-
.star-rating a.one-star {
-
left: 0px; }
-
.star-rating a.one-star:hover {
-
width: 25px; }
-
.star-rating a.two-stars {
-
left: 25px; }
-
.star-rating a.two-stars:hover {
-
width: 50px; }
-
.star-rating a.three-stars {
-
left: 50px; }
-
.star-rating a.three-stars:hover {
-
width: 75px; }
-
.star-rating a.four-stars {
-
left: 75px; }
-
.star-rating a.four-stars:hover {
-
width: 100px; }
-
.star-rating a.five-stars {
-
left: 100px; }
-
.star-rating a.five-stars:hover {
-
width: 125px; }
rate.rjs Y para terminar con las vistas nos faltan los estilos y las imágenes necesarias, que podremos sacar de Komodomedia, en este caso tendremos que añadir a nuestro archivos .css las siguientes lineas de código: Y para que valla como la seda tendréis que guardar en vuestra carpeta “images” en “public” la imagen star.gif Ya con esto lo tenemos todo casi listo, ahora solo nos falta decidir que queremos que sea “rateable”, por ejemplo si tememos el controlador “image.rb” haremos: En este caso vemos que el modelo controla unas imágenes, lo más habitual para esto sería poder “ratearlas” en el show. Pues en el show.html.erb pegamos: @image sería el objeto generado en tu controlador por: Estos dos últimos pasos son los únicos que tendremos que repetir para añadirlos a otros modelos como Videos, Posts, etc. Seguro que tu puedes mejorarlo, refactorizarlo, incluso tener tantas estrellas máximas como puedas. ¿Encontráis fallos?
page.replace_html “star-ratings-block”, :partial => ‘rating/rating’, :locals => { :asset => @asset }


Sin comentarios ↓
Nadie ha dejado ningún comentario, tu puedes ser el primero.
Leave a Comment