Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web

Mas vale tarde que nunca... este post debería haberlo escrito hace unos 2 meses, pero estos han sido frenéticos, mucho trabajo. Uno de los proyectos que me ha tenido más ocupado estos meses es verycocinar.com que en los próximos días verá la luz, la verdad es que está teniendo críticas muy positivas lo que me anima a continuar trabajando.

Bueno, aquí dejo las transparencias de la sesión: http://www.slideshare.net/spejman/inteligencia-artificial-y-ruby-on-rails-mejora-la-publicidad-de-tu-web

Y aquí el vídeo con la ponencia grabada:
http://2007.conferenciarails.org/videos/02_Rails_Hispana_2007_Sala2_Inteligencia_Artificial.wmv

Espero que sean de utilidad!

Etiquetas: , , ,

Posted by Spejman at 9:30 p. m. | 2 comments read on

La aplicación Rails que habla

Después de varias semanas sin publicar nada y de unas vacaciones, he acabado un ejemplo de lo que se puede hacer con festivaltts para Ruby: Un aplicación en Ruby on Rails que habla!

Puedes probarla en: http://thetalkingrailsapp.sergioespeja.com/

De momento sólo funciona con la voz inglesa, espero que te de ideas para tus aplicaciones RoR!

Etiquetas: , , ,

Posted by Spejman at 10:08 p. m. | 2 comments read on

MetaQuerier Beta

MetaQuerier es un plugin para Ruby on Rails que una vez instalado infiere la estructura de la base de datos y de los modelos de la aplicación Rails. Permite hacer consultas, guardar consultas parametrizadas para utilizarlas más adelante y ver la estructura de base de datos.

No requiere ningún tipo de configuración ( a excepción de que tengas instalado ActsAsAuthenticated y quieras deshabilitarlo). Para instalarlo hay que ejecutar:
script/plugin install svn://rubyforge.org/var/svn/meta-rails/plugins/meta_querier
Los prerequisitos son tener una versión de Ruby on Rails mayor o igual a la 1.2.0 (y tener activada la constante RAILS_GEM_VERSION que encontrarás en /config/environment.rb) o en caso contrario, tener instalado el plugin engines.

Una vez instalado podemos crear las consultas (queries), accediendo al controlador /meta_querier (ej: http://localhost:3000/meta_querier)


Guardarlas parametrizadas (Save):


Ver un listado de las queries que existen (List):


Ejecutar las queries (Run):


Como puedes ver este plugin puede ser muy interesante para generar pantallas de administración o incluso pantallas de listados con un esfuerzo mínimo. Forma parte del proyecto MetaRails que pretende hacer Ruby on Rails todavía más Don't Repeat Yourself.

Queda trabajo por hacer, pero antes de continuar me gustaría estabilizar el código actual. Si te interesa puedes ayudarme instalándote el plugin, probando si te funciona y enviándome tus comentarios.

Más información:

Etiquetas: , , ,

Posted by Spejman at 12:04 p. m. | 0 comments read on

Mi charla ha sido seleccionada para la Railsconf Europe 2007

La propuesta "Making Rails More (Artificially) Intelligent" ha sido elegida para presentarla en la Railsconf Europe 2007 que se celebrará del 17 al 19 de septiembre de este año en Berlín.

Estoy muy contento porque será una gran oportunidad para charlar con algunas de las personas que más saben y más han contribuido al desarrollo de Ruby on Rails.

Mi charla tratará sobre como usar Inteligencia Artificial en las aplicaciones RoR. El uso de la IA en aplicaciones RoR permitirá crear ideas web más innovadoras y originales.

Si tienes previsto asistir a la conferencia, espero que encuentres la propuesta interesante y vengas a verla ;)

Etiquetas: , , ,

Posted by Spejman at 3:01 p. m. | 8 comments read on

Voz en tus aplicaciones Ruby on Rails

Acabo de publicar la primera versión utilizable de festivaltts4r junto con su plugin para Ruby on Rails festivalttsOnRails. Con esta librería y este plugin podrás hacer que tus aplicaciones Ruby y Ruby on Rails hablen!

El plugin para rails en ubuntu es muy sencillo de utilizar:
  1. Instalar las librerías de tts y de generación de mp3:

    sudo apt-get install festival lame

  2. Instalar el plugin festivalttsOnRails para Ruby on Rails:

    script/plugin install \
    svn://rubyforge.org/var/svn/festivaltts4r/plugins/festivaltts_on_rails

  3. Utilizar el método text_to_flash_player(text) en tus vistas:

    <%= text_to_flash_player "Talk me!" %>

Actualmente el plugin solo está disponible en la versión con voz inglesa, pero como prueba de concepto ya puede servir. En función del interés por el plugin y de la ayuda de la comunidad puedo ir mejorándolo.

He comprobado que funciona en Ubuntu linux, si puedes probarlo en otras plataformas te agradecería que me comentases como funciona ;)

También puedes utilizar la librería festivaltts4r para realizar aplicaciones de voz con Ruby en modo local. Al igual que el plugin, es muy fácil de instalar y usar:
  1. Instalar las librerías de tts y de generación de mp3:

    sudo apt-get install festival lame

  2. Instalar la gem festivaltts4r:

    sudo gem install festivaltts4r

  3. Incluir las gems necesarias y llamar al método to_speech con que se define en la clase String:

    require "rubygems"
    require "festivaltts4r"

    "I'm talking".to_speech

Este proyecto se ha realizado utilizando las librerías Festival TTS y lame.

El reproductor de mp3 en flash que reproduce la voz en el plugin para rails esta realizado por dew con la licencia Creative Commons Attribution-ShareAlike License France.

Más información en la página oficial del proyecto: festivaltts4r.rubyforge.org

Etiquetas: , , , , ,

Posted by Spejman at 7:30 a. m. | 3 comments read on

Palabras reservadas de MySQL como nombre de modelo

Al generar un modelo con una migration en ruby on rails creamos una tabla en la base de datos. El nombre de esta tabla será igual a la forma pluralizada del nombre del modelo. En MySQL esta migration generará una sentencia sql de la forma:

CREATE TABLE model_name_pluralized (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY,
`created_on` date DEFAULT NULL, `name` varchar(255) DEFAULT NULL) ENGINE=InnoDB

Como puedes ver, los nombres de las columnas están entre comillas pero el nombre de la tabla no. Si utilizas como nombre de modelo la forma en singular de una palabra reservada de MySQL, la migration generará una sentencia sql que dará un error como:

Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'databases (`id` int(11) DEFAULT NULL
auto_increment PRIMARY KEY, `created_on` da' at line 1: CREATE TABLE databases (`id` int(11)
DEFAULT NULL auto_increment PRIMARY KEY, `created_on` date DEFAULT NULL, `name` varchar(255)
DEFAULT NULL) ENGINE=InnoDB

La semana pasada leí unas transparencias de Josh Susser (Laying Tracks) que me animaron a escribir un parche para este problema.

Antes de escribir nada miré si podía encontrar algo relacionado. Encontre algún ticket similar en el trac de Rails:


El ticket más interesante de estos es el #4905, donde se corrigen todas las sentencias MySQL que pueden generar ese error. No se porque pero este parche no está incluido en el código de rails a pesar de ser del 25 de mayo de 2006. El tickert #7850 está cerrado al considerarse duplicado respecto el #4905. Y la história del ticket #3631 acaba con la frase "no usar palabras reservadas", lo cual en mi opinión no es la mejor solución.

En resumen, el problema existe (no se pueden crear modelos con nombres como "database", "exist", etc ...) y el parche también existe (#4905). Entoces,
que se debe hacer ahora para arreglar este problema?

Etiquetas: , ,

Posted by Spejman at 12:20 p. m. | 0 comments read on

Instalar sqlite3 para rails en Ubuntu

  1. Instalar sqlite y sus librerías de desarrollo:

    sudo apt-get install sqlite3 libsqlite3-dev

  2. Instalar la interfaz sqlite3-ruby para poder conectarnos a la base de datos sqlite3 desde Ruby.

    sudo gem install sqlite3-ruby
    (Si aparecen varias versiones a escoger, seleccionar
    la última versión para ruby.
    )

  3. Crear la base de datos, realmente solo creamos un archivo vacío que es lo único que necesita sqlite3.

    touch database_name_dev.db
    touch database_name_test.db
    touch database_name_prod.db

  4. Configurar la aplicación Ruby on Rails para usar estas bases de datos.
    Modificar el archivo config/database.yml:

    development:
    adapter: sqlite3
    database: db/database_name_dev.db

    test:
    adapter: sqlite3
    database: db/database_name_test.db

    production:
    adapter: sqlite3
    database: db/database_name_prod.db

Listo! a partir de aquí puedes desarrollar tu aplicación rails usando sqlite3 como base de datos.

Etiquetas: , , ,

Posted by Spejman at 8:12 p. m. | 2 comments read on

Crear controladores y vistas en plugins Ruby on Rails

Uno de los plugins que forman el proyecto meta-rails (http://meta-rails.rubyforge.org)
se encarga de hacer un diagrama de las clases de la aplicación y proporciona un generador
de consultas a estas clases. Para realizar esto necesitaba cargar controladores y sus vistas
directamente desde este plugin.

Después de documentarme y hacer pruebas he encontrado la manera de hacerlo fácil.

  1. Cargar los controladores
    Todos los plugins en ruby on rails pueden tener el archivo init.rb en su carpeta raiz
    que se ejecuta al cargar la aplicación rails. Este archivo es el hook (gancho) que podemos
    utilizar para introducir código del plugin en la aplicación rails.

    Si ponemos nuestros controladores en el subdirectorio del plugin app/controllers, para cargarlos
    podemos utilizar el código siguiente:

    directory = "#{RAILS_ROOT}/vendor/plugins/NOMBRE_DEL_PLUGIN"
    controller_path = File.join(directory, 'app', 'controllers')
    require "#{controller_path}/NOMBRE_DEL_CONTROLADOR.rb"
    $LOAD_PATH << controller_path
    if defined?(RAILS_GEM_VERSION) and RAILS_GEM_VERSION >= '1.2.0'
    Dependencies.load_paths << controller_path
    else
    raise "Engines plugin is needed for running NOMBRE_DEL_PLUGIN with \
    a Ruby on Rails version < 1.2.0" if Dir["#{RAILS_ROOT}/vendor/plugins/engines"].empty?
    end
    config.controller_paths << controller_path


    Analizando el código vemos que este código se ejecuta de manera diferente según utilizemos
    versiones de Ruby on Rails posteriores a 1.2.0 o previas. Esto es porque para que funcione
    en versiones anteriores a 1.2.0 necesitamos el plugin engines instalado (http://rails-engines.org).

    Una vez puesto este código podemos crear nuestros controladores haciendo que hereden de ActionController::Base:

    class MetaQuerierController < ActionController::Base

    def index
    render :text => "Funciona!"
    end

    end

  2. Vistas para nuestros controladores
    Una vez hemos cargado los controladores, tenemos que asignarles los subdirectorios donde pueden
    encontrar sus vistas. Esto lo hacemos con cambiando una variable de clase con self.template_root:

    class MetaQuerierController < ActionController::Base
    self.template_root = "#{RAILS_ROOT}/vendor/plugins/meta_querier/app/views/"
    end


Espero que te sea de utilidad, puedes encontrar más información en:
  • http://weblog.techno-weenie.net/2007/1/24/understanding-the-rails-initialization-process

Etiquetas: , ,

Posted by Spejman at 8:33 a. m. | 0 comments read on

Logs del servidor con capistrano

Acabo de probar esta "receta" para capistrano publicada por DrNic. La encuentro muy útil, permite ver los logs del servidor ruby on rails mediante el comando cap log.

Código a insertar en config/deploy.rb:
# logs
desc "Devuelve las últimas líneas del archivo de log. Uso: cap log [-s lines=200] [-s rails_env=production]"
task :log do
lines = configuration.variables[:lines] || 200
rails_env = configuration.variables[:rails_env] || 'production'
run "tail -n #{lines} #{current_path}/log/#{rails_env}.log" do |ch, stream, out|
puts out
end
end


Una vez insertado este código podemos utilizarlo así:
cap log
cap log -s lines=1000
cap log -s lines=1000 rails_env=development


Más información:

Etiquetas: , , ,

Posted by Spejman at 10:26 a. m. | 0 comments read on

Serializar objetos en Ruby on Rails con Active Record

Muchas veces nos es cómodo guardar en la base de datos estructuras de datos como arrays o hashes.

En Ruby on Rails podemos hacerlo fácilmente con el método serialize de ActiveRecord. Este método permite guardar objetos en un campo de la base de datos en formato texto. Utiliza el formato YAML para convertir el objeto a texto.



class Ejemplo < ActiveRecord::Base
serialize :datos
end

Ahora podemos utilizar la clase Ejemplo de la siguiente manera:



ej = Ejemplo.create(:datos => {'clave1' => 'atributo1', 'clave2' => 2 })
puts ej.datos['clave2']

Utilizar serialize nos puede ahorrar muchas líneas de código ;)



Más información:

Etiquetas: , ,

Posted by Spejman at 9:45 p. m. | 0 comments read on

Configurar capistrano en servidores compartidos

Esta es la configuración de capistrano para desplegar una aplicación en Site5 cuando tenemos el código en un repositorio subversion. Posiblemente puede utilizarse en otros servidores compartidos con ligeras modificaciones.

Para escribir este post he realizado un despliegue real de una aplicación, he consultado el tutorial que encontré en http://www.thebitguru.com/articles/9-Setting+up+Capistrano+on+Site5 y he utilizado el soporte de los técnicos de Site5 que me han ayudado durante el proceso con un problema de permisos que había en el servidor.

  1. (este punto es específico de Site5) Pedir que te cambien el shell por defecto de jailshell a bash.

  2. Configurar el entorno de desarrollo: desde el subdirectorio de tu aplicación rails ejecutar cap --apply-to . NOMBRE_APLICACION este comando generará:

    exists config
    create config/deploy.rb
    exists lib/tasks
    create lib/tasks/capistrano.rake

  3. Editar las opciones de configuración: en el archivo config/deploy.rb
    1. Indicar la URL del repositorio subversion:
      set :repository, "svn+ssh://USUARIO@DOMINIO/RUTA_DEL_REPOSITORIO"

    2. Poner las direcciones de cada rol de tu aplicación (web, app, db). Típicamente solo se utilizan :web y :app poniendoles el nombre del dominio (por ejemplo "bee.com.es" ).

    3. Descomentar la linea "deploy_set" indicándole la ruta correcta hacia el subdirectorio del servidor donde quieres que se instale la aplicación, por ejemplo:
      set :deploy_to, "/home/TU_USERNAME/apps/#{application}"

    4. Si el username del servidor es diferente del de la máquina desde donde usarás capistrano, descomenta la línea "user" y pon tu username:
      set :user, "TU_USERNAME"

    5. Añadir las siguientes tareas de capistrano al final del archivo:
      desc "Link in the production database.yml and fix permissions"
      task :after_update_code do
      run "find #{release_path}/public -type d -exec chmod 0755 {} \\;"
      run "find #{release_path}/public -type f -exec chmod 0644 {} \\;"
      run "chmod 0755 #{release_path}/public/dispatch.*"
      end

      desc "Restart the web server. Overrides the default task for Site5 use."
      task :restart, :roles => :app do
      run "chmod 755 #{current_path}/public/dispatch.fcgi"
      run "touch #{current_path}/public/dispatch.fcgi"
      end

  4. Configurar el servidor: Ejecutar desde la raiz de la aplicación el comando cap setup

  5. Cambiar la linea de public/.htaccess:
    RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
    por:
    RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
    Fíjate que solo es cambiar la extensión .cgi por .fcgi

  6. Listo! ahora para desplegar tu aplicación solo tienes que ejecutar desde la raiz de la aplicación el comando cap deploy


Posibles errores:
  • Si el protocolo de tu repositorio subversion es svn+ssh, es decir, utiliza ssh tienes que pedir que te perimitan realizar ssh desde el servidor porque por defecto lo tienen deshabilitado.

Etiquetas: , , ,

Posted by Spejman at 10:25 a. m. | 1 comments read on

Generador automático de consultas en Ruby on Rails

Estoy intentando hacer una especie de query builder en ruby on rails que permita al usuario crear consultas a la base de datos teniendo en cuenta todas las tablas y sus atributos.

Haciéndolo estoy aprendiendo mucho del código interno de ActiveRecord, os comento un par de trucos que he aprendido y alguna duda que me ha surgido.

  1. ¿Cómo sabe ActiveRecord las columnas de las tablas que forman los métodos de sus objetos? En mysql utiliza la query "SHOW FIELDS FROM nombre_tabla" y lo hace en el método ActiveRecord::Base.connection.columns(nombre_tabla).


  2. ¿Cómo saber las tablas que hay actualmente en la bd? Para saber esto he utilizado la sentencia sql de mysql "SHOW TABLES", ejecutando ActiveRecord::Base.connection.select_values("SHOW TABLES") obtenemos un array con todos los nombres de las tablas que hay en la bd.


  3. ¿Cómo saber que objetos ActiveRecord válidos hay en la aplicación RoR que estamos ejecutando a partir de la lista de nombres de tablas? Para hacer esto utilizo el siguiente código:

    table_names.each do |table_name|
    # comprobación de seguridad antes de hacer el eval.
    next if table_name.include?(";") or \
    table_name =~ /\s/
    table_name = table_name.classify
    begin
    activerecord_classes_names << table_name \
    if eval("#{table_name}.class == Class")
    rescue; end
    end

    No se si es la mejor manera, pero no se me ocurrió ninguna otra puesto que no he encontrado ningún método que me muestre las clases que existen en la aplicación, pero debe haberlo si tu lo sabes por favor dímelo ;)


  4. ¿Como saber las asociaciones que tiene un objeto ActiveRecord con otros objetos ActiveRecord? En la clase ActiveRecord existe el método de clase "reflections" que retorna un hash con los nombres de las asociaciones apuntando a objetos del tipo ActiveRecord::Reflection::AssociationReflection que, entre otros, tienen los siguientes atributos:
    • class_name: Nombre de la clase destino

    • macro: símbolo correspondiente al tipo de relación (has_many, belongs_to, ...)

Etiquetas: , ,

Posted by Spejman at 1:10 p. m. | 5 comments read on

Ver que attributos tiene un objeto ActiveRecord

El plugin annotate models nos permite ver los atributos de una clase ActiveRecord (columnas de la tabla en la base de datos) de manera cómoda en el código de la clase. Es muy útil para no tener que estar consultando la estructura de la base de datos al olvidarnos de los métodos de una clase, de manera que podremos programar más rápido y no repetir declaraciones (DRY) ya que lo hace automáticamente.

Consiste en una tarea para rake que al ejecutarla nos escribe en las cabeceras de las clases del modelo la información asociada que obtiene de la base de datos. Por ejemplo:

# == Schema Information
# Schema version: 39
#
# Table name: signatures
#
# id :integer(11) not null, primary key
# lema :string(255)
# language_id :integer(10) default(0), not null
# domain_id :integer(10) default(0), not null
# created_on :date
# category_id :integer(10) default(0), not null
# linguistic_cue_group_id :integer(10) default(0), not null
#


Cómo instalarlo:
      1. Instalar el plugin
      script/plugin install \
      http://svn.pragprog.com/Public/plugins/annotate_models

      2. Ejecutar el script que anota los modelos
      rake annotate_models


Referencias:

Etiquetas: , ,

Posted by Spejman at 12:19 p. m. | 2 comments read on

ActiveRecord: diferencias entre save, save!, create y create!

ActiveRecord define varias maneras para guardar un objeto (instancia de un modelo) en la base de datos, es importante saber como actúa cada una para luego no tener sorpresas y usar el más adecuado en cada momento.

  • save: Devuelve true si el objeto se ha guardado correctamente, o nil en caso contrario. No genera ninguna excepción.


  • save!: Devuelve true si el objeto se ha guardado correctamente, y si no ha podido guardarse lanza una excepción con el error.
    Esta excepción es del tipo ActiveRecord::RecordInvalid, se lanza principalmente cuando hay errores de validación (campo obligatorio vacío, email no válido, etc ...) y la podemos usar para mostrar el error al usuario.


  • create: Retorna siempre el objeto independientemente de que se haya guardado con éxito o no, tenemos que consultar el objeto por si ha ocurrido algún error de validación.


  • create!: Aparece en Rails 1.2, yo no lo he podido probar todavía pero por lo que pone en Agile Web Development with Rails devuelve el objeto si se ha guardado con éxito, sino retorna una excepción al igual que save!



Más información:


Etiquetas: , ,

Posted by Spejman at 4:59 p. m. | 0 comments read on

Completar con el tabulador y colorear irb con Wirble

Hoy he probado Wirble siguiendo el tutorial en ingles de Ruby Inside y lo encuentro muy útil, sobretodo porque permite autocompletar con el tabulador! Se acabó utilizar print objeto.methods.sort.join("\n") cada vez que no te acuerdas del nombre de un método.

Para utilizarlo hay que instalar la gem:

gem install -y wirble


Y si utilizas linux hay que editar el archivo ~/.irbrc y añadir:

require 'rubygems'
require 'wirble'
Wirble.init
Wirble.colorize


En Windows no se como funcionará si alguien lo sabe que me lo diga y actualizo el post. En mac os supongo que funcionará igual.

Etiquetas: , ,

Posted by Spejman at 1:10 p. m. | 2 comments read on

Instalar ruby gems en servidores compartidos sin permisos de root

Para realizar esto necesitamos saber donde están alojadas actualmente las ruby gems y añadir un nuevo repositorio en un subdirectorio nuestro (por ejemplo /home/Nombre_De_Usuario/gems), cambiando las variables GEM_PATH y GEM_HOME

Este pequeño truco nos permite tener un servidor 100% funcional para trabajar con Ruby on Rails en servidores de hosting con precios muy competitivos como Site5, que perdonad por la publicidad pero me impresionó: ofrecen unos atractivos 5TB de transferencia al mes, 55 Gb de espacio, 55 dominios, etc por 5$ al mes si pagas 2 años por adelantado, osea 120$ pero tienes 60 días de prueba, si no te gusta te devuelven el dinero, bueno no hago más publicidad, si os interesa aquí tenéis más información: Site5

Explicación paso a paso


Para ver dónde están las ruby gems actualmente hay que ejecutar el comando desde una consola en el servidor compartido:

gem environment


Este comando generará una salida similar a esta:

Rubygems Environment:
- VERSION: 0.8.10 (0.8.10)
- INSTALLATION DIRECTORY: /usr/lib/ruby/gems/1.8
- GEM PATH:
   - /usr/lib/ruby/gems/1.8
- REMOTE SOURCES:
   - http://gems.rubyforge.org


Una vez hemos creado el subdirectorio /home/Nombre_De_Usuario/gems, podemos cambiar las variables GEM_PATH y GEM_HOME creando un archivo llamado .gemrc en nuestra carpeta personal /home/Nombre_De_Usuario. El formato del archivo .gemrc es YAML, por lo que tiene que ser como el siguiente cambiando Nombre_De_Usuario y /usr/lib/ruby/gems/1.8 por nuestro nombre de usuario y por el anterior GEM PATH (que hemos averiguado con el comando gem environment) respectivamente.

.gemrc:
gemhome: /home/Nombre_De_Usuario/gems
gempath:
- /home/Nombre_De_Usuario/gems
- /usr/lib/ruby/gems/1.8


Si ahora ejecutamos gem environment obtenemos:

Rubygems Environment:
- VERSION: 0.8.10 (0.8.10)
- INSTALLATION DIRECTORY: /home/Nombre_De_Usuario/gems
- GEM PATH:
   - /home/Nombre_De_Usuario/gems
   - /usr/lib/ruby/gems/1.8
- REMOTE SOURCES:
   - http://gems.rubyforge.org


Mas información:

Etiquetas: , , ,

Posted by Spejman at 11:00 a. m. | 2 comments read on

Autenticación o login de usuarios en Ruby on Rails

Existe un plugin para Ruby on Rails llamado Acts As Authenticated que nos ahorra la siempre repetitiva tarea de la autenticación ( login ) de usuarios en RoR, crea el modelo para el usuario, el controlador y las vistas para realizar login, logout, comprobar si el usuario esta autenticado, etc ...

La instalación es simple, ejecutar los siguientes comandos desde la raíz de la aplicación rails:

  1. Descargar el código del repositorio subversion:
    script/plugin source http://svn.techno-weenie.net/projects/plugins

  2. Instalar el plugin
    script/plugin install acts_as_authenticated

  3. Generar el modelo User y el controlador Account
    script/generate authenticated user account

  4. Crear la tabla de usuarios en la base de datos
    rake migrate



Para configurarlo y empezarlo a usar tenemos que mover la linea que pone "include AuthenticatedSystem" de /app/controllers/account_controller.rb a /app/controllers/aplication.rb

Finalmente tenemos que decidir si queremos añadir autenticación a por defecto a todas las páginas y explicitar las páginas que queremos que sean públicas, o tener por defecto todas las páginas públicas y marcar las páginas que queremos autenticar una a una.

Para la primera opción tenemos que añadir la linea "before_filter :login_required" en /app/controllers/aplication.rb y la línea "skip_before_filter :login_required" en los controladores de las páginas que queremos que sean públicas.

Si por el contrario deseamos que todas las páginas sean por defecto públicas, debemos explicitar en las páginas que queremos autenticación añadiendo la línea "before_filter :login_required" en su controlador:

class MiPaginaProtegidaController < ApplicationController
before_filter :login_required
end


Si queremos autenticar solo algunas acciones dentro del controlador, podemos usar el parámetro "only" de la función "login_required". Por ejemplo si sólo queremos que se necesite autenticación en las acciones edit y update del controlador:

class MiPaginaProtegidaController < ApplicationController
before_filter :login_required, :only => [ :edit, :update ]
end


El único problema que le he encontrado a este plugin es que el formulario de login ( /app/views/account/login.rhtml) no funciona, debeis reemplazarlo por:


<%= start_form_tag %>
<p><label for="login">Login</label><br/>

<%= text_field_tag 'login' %></p>

<p><label for="password">Password</label><br/>
<%= password_field_tag 'password' %>
</p>

<!-- Uncomment this if you want this functionality
<p><label for="remember_me">Remember me:</label>
<%= check_box_tag 'remember_me' %></p>
-->

<p>
<%= submit_tag 'Log in' %></p>

<%= end_form_tag %>

Más información (en inglés): http://technoweenie.stikipad.com/plugins/show/Acts+as+Authenticated

Etiquetas: , ,

Posted by Spejman at 8:00 p. m. | 29 comments read on

¿Como convencer a alguien para que use Ruby on Rails?

Supongo que algunos de vosotros os habréis hecho esta misma pregunta, si habéis encontrado la respuesta agradecería que la pusieseis en los comentarios de este blog ;)

Me explico, la semana que viene intentaré convencer a unos amigos de mi antiguo trabajo de lo que van a ganar en calidad de vida si se pasan a Ruby on Rails. Parece tarea fácil si no fuera porque están un poco hartos de oír sobre frameworks maravillosos que automatizan todo, pero que a la hora de la verdad si te sales de lo común no hacen más que aumentar el sufrimiento del programador.

Mi idea es hacer unas transparencias donde mostrar por encima el mundo Ruby y Ruby on Rails, y acabar con una demo. Toda esta documentación la colgaré para ayudar a otros "evangelizadores" de Ruby on Rails ;)

  • ¿Que partes de Rails destacaríais? Yo he pensado centrarme en el modelo MVC, ActiveRecord, migrations y partials.

  • ¿Como demostraríais que Ruby mola?He pensado empezar con la comparación de Ruby con C# de rubyclr.com y continuar con ideas que he visto en la presentación de Sergio Gil en la conferencia rails hispana:
    • Cercano a nuestra forma de pensar
    • Minimiza el código:
      • Menos errores de código
      • Código más bonito


Cualquier idea que se os ocurra (ejemplos de código, característica de Ruby o de Rails a destacar, etc) puede ayudar para hacer un documento más útil.

Gracias a todos por adelantado!

Etiquetas: ,

Posted by Spejman at 11:22 a. m. | 1 comments read on

Cachear objetos del modelo en Ruby on Rails con Memcached en Ubuntu

Cachear objetos del modelo en Ruby on Rails es muy fácil utilizando CachedModel, que permite cachear los objetos de nuestra aplicación Rails que recuperamos uno a uno. Es decir, acelera consultas del tipo Modelo.find(:first) o Modelo.find(id).

Para usarlo debemos instalar memcached y hacer que nuestras clases del modelo extiendan de "CachedModel" en lugar de "ActiveRecord::Base".


  1. Instalar memcached en Ubuntu

    apt-get install memcached



  2. Instalar la ruby gem

    sudo gem install cached_model



  3. Configurar nuestro proyecto rails
    Poner la siguiente linea con el nombre de nuestro proyecto en el archivo config/environment.rb

    # Conf. CachedModel
    require 'cached_model'

    memcache_options = {
    :c_threshold => 10_000,
    :compression => true,
    :debug => false,
    :namespace => 'NOMBRE_DE_NUESTRO_PROYECTO_RAILS',
    :readonly => false,
    :urlencode => false
    }

    CACHE = MemCache.new memcache_options
    CACHE.servers = 'localhost:11211'




  4. Cachear las clases
    Substituir en cada clase del modelo que nos interese cachear donde pone "ActiveRecord::Base" por "CachedModel"
    Ejemplo:

    class MiClase < CachedModel
    end




Enlaces:

Etiquetas: , , ,

Posted by Spejman at 10:46 a. m. | 0 comments read on

Crear Ruby Gems fácilmente

Las ruby gems permiten instalar librerías de Ruby con un simple comando desde cualquier máquina que interprete Ruby y tenga ruby gems instalado.

Para crear Ruby gems fácilmente podemos utilizar la librería NewGem

1. Instalación:

gem install newgem


2. Creación del esqueleto de la ruby gem

newgem NOMBRE_DE_LA_NUEVA_GEM


Este script creará varios ficheros y subdirectorios necesarios para automatizar todo lo que habitualmente necesitamos para gestionar la creación y difusión de ruby gems.

3. Copiar el código de nuestra gem

Todo el código que queremos empaquetar en la ruby gem tenemos que copiarlo en el subdirectorio que ha creado el script anterior llamado lib/NOMBRE_DE_LA_NUEVA_GEM

Esto funciona porque en el archivo lib/NOMBRE_DE_LA_NUEVA_GEM.rb incluye automáticamente todos los archivos .rb del subdirectorio lib/NOMBRE_DE_LA_NUEVA_GEM, magia? no, una linea en ruby:

lib/NOMBRE_DE_LA_NUEVA_GEM.rb:
Dir[File.join(File.dirname(__FILE__), 'NOMBRE_DE_LA_NUEVA_GEM/**/*.rb')].sort.each { |lib| require lib }


4. Número de versión

Antes de generar nuestra gem es mejor indicar el número de versión de esta. El fichero lib/NOMBRE_DE_LA_NUEVA_GEM/version.rb contiene las constantes MAYOR, MINOR y TINY. Los valores que demos a estas constantes servirán para definir la versión de la gem.

lib/NOMBRE_DE_LA_NUEVA_GEM/version.rb:
module NOMBRE_DE_LA_NUEVA_GEM #:nodoc:
module VERSION #:nodoc:
MAJOR = 0
MINOR = 0
TINY = 1

STRING = [MAJOR, MINOR, TINY].join(’.')
end
end


5. Crear la gem

rake package


Este comando nos generará la gem con el nombre NOMBRE_DE_LA_NUEVA_GEM-MAYOR.MINOR.TINY.gem en el subdirectorio pkg.

6. Instalar la gem en nuestro sistema

gem install pkg/NOMBRE_DE_LA_NUEVA_GEM-MAYOR.MINOR.TINY.gem


Si queremos que todo el mundo pueda usar nuestra gem con el comando gem install NOMBRE_DE_LA_NUEVA_GEM tenemos que crear un proyecto en RubyForge y crear un fichero con la gem que acabamos de generar.

Etiquetas: , ,

Posted by Spejman at 7:09 p. m. | 0 comments read on
Recommend Me


XING
View Sergio Espeja's profile on LinkedIn













Enlaces