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: conferenciarails, conferenciarails2007, rails, RubyOnRails
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: festivalttsOnRails, rails, ruby, RubyOnRails
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_querierLos 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:
- Página del proyecto: http://meta-rails.rubyforge.org
Etiquetas: metarails, rails, ruby, RubyOnRails
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: rails, railsconfeurope2007, ruby, RubyOnRails
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:
- Instalar las librerías de tts y de generación de mp3:
sudo apt-get install festival lame - Instalar el plugin festivalttsOnRails para Ruby on Rails:
script/plugin install \
svn://rubyforge.org/var/svn/festivaltts4r/plugins/festivaltts_on_rails - 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:
- Instalar las librerías de tts y de generación de mp3:
sudo apt-get install festival lame - Instalar la gem festivaltts4r:
sudo gem install festivaltts4r - 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: festivaltts4r, festivalttsOnRails, rails, ruby, RubyOnRails, text-to-speech
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:
- #7850: [PATCH] Added missing backticks to mysql adapter
- #4905[PATCH] Rails should backtick table names automagically
- #3631: table names should be quoted
- #1633: [PATCH] quote_column_name in ActiveRecord::ConnectionAdapters ...
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: rails, ruby, RubyOnRails
Instalar sqlite3 para rails en Ubuntu
- Instalar sqlite y sus librerías de desarrollo:
sudo apt-get install sqlite3 libsqlite3-dev - 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.) - 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 - 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: rails, ruby, RubyOnRails, ubuntu
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.
- 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 - 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: rails, ruby, RubyOnRails
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 comandocap 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
endUna 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: capistrano, rails, ruby, RubyOnRails
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:
- http://ar.rubyonrails.org/
- Rails: ActiveRecord Serialize method
- Querying serialized data in ActiveRecord
Etiquetas: rails, ruby, RubyOnRails
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.
- (este punto es específico de Site5) Pedir que te cambien el shell por defecto de jailshell a bash.
- Configurar el entorno de desarrollo: desde el subdirectorio de tu aplicación rails ejecutar
cap --apply-to . NOMBRE_APLICACIONeste comando generará:
exists config
create config/deploy.rb
exists lib/tasks
create lib/tasks/capistrano.rake - Editar las opciones de configuración: en el archivo config/deploy.rb
- Indicar la URL del repositorio subversion:
set :repository, "svn+ssh://USUARIO@DOMINIO/RUTA_DEL_REPOSITORIO" - 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" ).
- 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}" - 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" - 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
- Indicar la URL del repositorio subversion:
- Configurar el servidor: Ejecutar desde la raiz de la aplicación el comando
cap setup - 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 - 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: hosting, rails, ruby, RubyOnRails
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.
- ¿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). - ¿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. - ¿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 ;) - ¿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: rails, ruby, RubyOnRails
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: rails, ruby, RubyOnRails
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: rails, ruby, RubyOnRails
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ó utilizarprint 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: rails, ruby, RubyOnRails
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_HOMEEste 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:
- http://forums.site5.com/showthread.php?t=11954&highlight=ruby+gem
- http://blog.nanorails.com/articles/2006/08/12/install-your-own-ruby-on-a-shared-host
Etiquetas: hosting, rails, ruby, RubyOnRails
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:
- Descargar el código del repositorio subversion:
script/plugin source http://svn.techno-weenie.net/projects/plugins - Instalar el plugin
script/plugin install acts_as_authenticated - Generar el modelo User y el controlador Account
script/generate authenticated user account - 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: rails, ruby, RubyOnRails
¿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: rails, RubyOnRails
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".
- Instalar memcached en Ubuntu
apt-get install memcached - Instalar la ruby gem
sudo gem install cached_model - 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' - 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:
- Página de CachedModel: http://dev.robotcoop.com/Libraries/cached_model/
- Página de memcached: memcached
Etiquetas: rails, ruby, RubyOnRails, ubuntu
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: rails, ruby, RubyOnRails



