Apuntes Rails

Apuntes de Ruby on Rails, programación en GNU/Linux y Mac

Adjuntar archivos con Rails

TAGS: None

Interesante artículo para adjuntar archivos con Rails

http://jimneath.org/2008/05/15/swfupload-paperclip-and-ruby-on-rails/

Relaciones Muchos a muchos con tablas “no railianas”

TAGS: None

Si tenemos que usar BD ya existentes y no podemos adaptarlas a Rails… tendremos que adaptar rails a la BD.

Tenemos las siguientes relaciones en la BD

Equipos Equiposprotocolos Protocolos
pkequipos pkequiposprotocolos pkprotocolos
fkequipos
fkprotocolos

Ahora vamos a crear los modelos para relacionar esta tablas con la siguiente advertencia:

IMPORTANTE: El nombre del modelo de la tabla intermedia DEBE DE SER SINGULAR!!!!

Vamos a ver como quedaría

equipos.rb

  1. class Equipos < ActiveRecord::Base
  2.    set_table_name  "equipos"
  3.    set_primary_key "pkequipos"
  4.  
  5.     has_many :equiposprotocolo , :foreign_key => "fkequipos"
  6.     has_many :protocolos, :foreign_key => "fkprotocolos", :through => :equiposprotocolo
  7. end

equiposprotocolo.rb

  1. class Equiposprotocolo < ActiveRecord::Base
  2.     #IMPORTANTE!!! Tanto el nombre del archivo como el de la clase tienen que ser en singular para las tablas de unión!!!!
  3.    set_table_name  "equiposprotocolos" # El nombre de la tabla en la base de datos no importa
  4.    set_primary_key "pkequiposprotocolos"
  5.  
  6.    belongs_to :equipos , :foreign_key => "fkequipos"
  7.    belongs_to :protocolos , :foreign_key => "fkprotocolos"
  8. end

protocolos.rb

  1. class Protocolos < ActiveRecord::Base
  2.     set_table_name  "protocolos"
  3.    set_primary_key "pkprotocolos"
  4.  
  5.  has_many :equiposprotocolo , :foreign_key => "fkprotocolos"
  6.  has_many :equipos, :foreign_key => "fkequipos", :through => :equiposprotocolo
  7. end

Con esto podemos hacer por ejemplo

  1. Equipos.find(1).protocolos
  2. Protocolos.find(1).equipos

Espero que os sea de utilidad

Creando un filtro fecha

TAGS: None

Aunque parezca una tontería pero siempre es util tener un partial con un selector de fecha.

Creamos un parcial por ejemplo _date_select.erb

  1. <%
  2. name = "date" if name.nil?
  3. %>
  4.      <%=select_day(1,:prefix=>name)%>/
  5.      <%=select_month(Date.today,
  6. :use_month_names =>  %w( Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre  Diciembre),:prefix=>name)%>/
  7.      <%= select_year(Date.today, :start_year => Communicationsview.first_year, :end_year =>Communicationsview.last_year,:prefix=>name) %>
  8.  

Ahora solo falta llamar desde una vista usando

  1. <%=render :partial=>"/fijos/date_filter" , :locals=>{:name =>"filtro[fecha]"} %>
  2.  

Fácil, verdad?

Creación de ScreenCast en Ubuntu

TAGS: None

He tenido que crear una serie de video-tutoriales para Guadalinfo y tras buscar un poco he encontrado esta herramienta:

RecordMyDesktop

Es muy fácil de usar. Para pasar los vídeos OGV a AVI solo tenemos que hacer:

mencoder mi-video.ogv -ovc xvid -xvidencopts  fixed_quant=5 -o mi-video.avi

Puede que nos falten algunas librerías:

sudo apt-get install mencoder libavformat52

Algunas aplicaciones más para crear ScreenCast son:

WinK: Muy recomendable. Crea en formato flash y podemos hacer la animación interactiva
CamStudio
Screencast-o-Matic: Crea los vídeos desde la propia web

Problemas con Rails 2.2 y MySql

Tags: ,

Recién actualizado Rails a su versión 2.2 me encuentro con el siguiente error:

!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.

Intento instalar la gem de mysql pero me suelta:


Building native extensions. This could take a while...
ERROR: Error installing mysql:
ERROR: Failed to build gem native extension.

*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Bien, he dado con este post donde explica que solo tenemos que instalar lo siguiente:

  1. sudo apt-get install libmysqlclient15-dev
  2. sudo gem install mysql

En mi mac me ha pasado lo mismo y e seguido este artículo:

  1. sudo gem install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config
  2.  

También me he encontrado con los siguientes problemas con algunas de las aplicaciones anteriores que tenia.

undefined method `cache_template_extensions=' for ActionView::Base:Class

Se soluciona comentando la linea cache_template_extensions = false de config/environments/development.rb

En otra aplicación me soltaba:

uninitialized constant ApplicationController

Se soluciona haciendo

  1. rake rails:update

Y con el plugin filecolumn igual:

Nos vamos al archivo file_column.rb y en la linea 619 ponemos

  1. ActiveSupport::Inflector.underscore(self.name).to_s

Espero que os sea de ayuda

Backup de Rails usando Rake

TAGS: None

Para simplificar los backups de nuestras aplicaciones podemos usar rake. Para hacernos con el es recomendable consultar el siguiente artículo Ruby on Rails Rake Tutorial

Los scripts propios los creamos en la carpeta lib/task

Vamos a crear un conjunto de acciones (task) dentro de la categoría (namespace) rbackup.

Queremos que este script nos haga un backup de la base de datos y de algunas carpetas de public (por ejemplo la carpera upload) y que nos copie todo comprimido en un archivo accesible desde la web.

Lo primero que hacemos es crear el archivo lib/task/rbackup.rake y definir la categoria:

  1. namespace :rbackup do
  2.  
  3. end

Bien, ahora vamos a definir las acciones que vamos a necesitar

  1. namespace :rbackup do
  2. desc "Crea los directorios tmp/backup y public/backup"
  3. task :crea_dir do
  4. end
  5.  
  6. desc "Copia de seguridad de la base de datos en la carpeta tmp/backup"
  7. task :base_datos => :crea_dir do
  8. end
  9.  
  10. desc "Crea una copia de seguridad de las carpetas indicadas"
  11. task :carpetas => :crea_dir do
  12. end
  13.  
  14. desc "Crea una copia de la BD y de las carpetas y las comprime en pubic/backup "
  15. task :all => [:base_datos, :carpetas]do
  16. end
  17. end

Ejecutando rake –task y nos da información de losa task disponibles
Para ejecutar estas acciones podemos poner rake rbackup:base_datos o rake rbackup:all

Vamos a crear los task….

Este nos creará los directorios si no existen

  1. task :crea_dir do
  2. unless File.exist?("#{RAILS_ROOT}/public/backup")
  3. puts "Creando directorio public/backup"
  4. sh "mkdir #{RAILS_ROOT}/public/backup/"
  5. end
  6. unless File.exist?("#{RAILS_ROOT}/tmp/backup")
  7. puts "Creando directorio tmp/backup"
  8. sh "mkdir #{RAILS_ROOT}/tmp/backup/"
  9. end
  10. end

Para hacer el backup de la base de datos extraemos los datos del archivo database.yml para poder usarlos con el comando mysqldump

Como usamos YAML es necesario poner al principio del archivo require ‘yaml’

  1. task :base_datos => :crea_dir do
  2. @conf = YAML::load(File.open("#{RAILS_ROOT}/config/database.yml"))
  3. @db = @conf[‘development’]
  4. # Hacemos una copia de la base de datos en el directorio temporal
  5. puts "******  Creando copia de seguridad de #{@db['database']}…  ******"
  6. sh "mysqldump –opt –user=#{@db['username']} –password=#{@db['password']} #{@db['database']} -h #{@db['host']} > tmp/backup/#{@db['database']}.sql"
  7. end

con => :crea_dir le indicamos que tiene que ejecutar antes el task crea_dir

Nota: si no ponemos -h #{@db['host']} puede salirnos el error mysqldump error 2002

Ahora comprimimos las carpetas usando tar.

  1. desc "Crea una copia de seguridad de las carpetas indicadas"
  2. task :carpetas => :crea_dir do
  3. @carpetas = %w(images uploads)
  4. for carpeta in @carpetas
  5. puts "****** Creando copia de #{carpeta}… ******"
  6. system("tar cvzf ‘#{RAILS_ROOT}/tmp/backup/#{carpeta}.tar.gz’ ‘#{RAILS_ROOT}/public/#{carpeta}’")
  7. #  unless  system(comando)
  8. #    flash[:error] = comando
  9. #  end
  10. end
  11. end

En la variable @carpetas ponemos las carpetas de pubic de las que queremos hacer el backup

Por ultimo hacemos un task que nos ejecute todas las acciones:

  1. task :all => [:base_datos, :carpetas]do
  2. puts "******  Comprimiendo y publicando….  ******"
  3. system("tar cvzf  ’#{RAILS_ROOT}/public/backup/#{@db['database']}#{Date.today}.tar.gz’ ‘#{RAILS_ROOT}/tmp/backup’")
  4. puts "******  #{@db['database']}#{Date.today}.tar.gz creado  ******"
  5. puts "******  Borrando datos de tmp/backup…  ******"
  6. system("rm -f #{RAILS_ROOT}/tmp/backup/*")
  7. end

Ya tenemos nuestro script rake terminado. Ahora podemos crear un controlador para tener acceso a los archivos generados y poder borrarlos una vez descargados.

Creamos un controlador rbackup_controller.rb y ponemos:

  1. class RbackupController < ApplicationController
  2.  
  3. def index
  4. @dir = Dir.new("#{RAILS_ROOT}/public/backup")
  5. @archivos = Array.new
  6. @dir.each do |x|
  7. if x[0] != 46
  8. @archivos =   @archivos + ["#{x}"]
  9. end
  10. end
  11.  
  12. end
  13.  
  14. def borrar
  15. comando = "rm -f #{RAILS_ROOT}/public/backup/#{params[:archivo]}"
  16. unless  system(comando)
  17. flash[:error] = comando
  18. end
  19. redirect_to :action => ‘index’
  20. end
  21. end

Ahora solo queda poner en la vista del controlador:

Listado de Archivos generados<br><br>

<% for archivo in @archivos %>

<%=link_to archivo, “backup/#{archivo}”%> - <%=number_to_human_size File.size(”#{RAILS_ROOT}/public/backup/#{archivo}”)%> - <%=link_to “borrar” , {:controller=>:rbackup,:action=>:borrar,:archivo=>archivo}, :confirm =>”Desea borrarlo?”%><br>

<% end %>
y tenemos un sistema de backups básico.

Rmagick en Ubuntu 8.04

TAGS: None

Pasos que he tenido que dar para instalar Rmagick en mi nueva Ubuntu 8.04

Siguiendo los pasos de este post me daba error al instalar la gema. La solución la he encontrado  aquí.

Resumiendo:

  1. apt-get install imagemagick
  2. apt-get install libmagick9-dev
  3. apt-get install ruby1.8-dev
  4. gem install rmagick

Scaffold con Rails 2.0

TAGS: None

He leído aquí un artículo muy ilustrativo de la nueva forma de trabajar con scaffold en Rails 2.0. El resumen es el siguiente:

  • Installed Rails
    #gem install rails –include-dependencies
  • Created an aplication with the rails command
    $rails exchange
  • Created the databases for the application with the rake command
    $ rake db:create:all
  • Used the script/generate command to create the scaffolding for the application
    $ ruby script/generate scaffold Movie title:string description:text one_sheet_url:string
  • Created the database table using the generated migration file
    $ rake db:migrate
  • Started the webserver with the script/server command
    $ ruby script/server
  • Pointed our web browser to the application and started entering and editing data
    http://localhost:3000/movies


Limpiando copia local de Subversion con Rsync

TAGS: None

Si tienes una copia de un repositorio Subversion y quieres limpiar los directorios .svn es tan facil como:

rsync -rC original copia_limpia

Creando Diagramas de nuestros proyectos

TAGS: None

Bien, un paso mas en la gestión de proyectos con Rails es la creación de diagramas antes y durante el proyecto. Lo ideal es crear un modelo UML (cosa que por desgracia casi nunca hago) antes de empezar a picar código. Para ello he encontrado algunas herramientas (para Mac)que nos pueden ayudar.

TaskSketch: Utilidad muy sencilla e intuitiva. Aunque no es muy potente es muy útil para hacer diagramas que especifiquen las distintas tareas que realizará la aplicación y los diagramas de flujo.

RailRoad: Es un script Ruby que analiza nuestra aplicación Rails y crea un diagrama de clases. La verdad que es bastante sorprendente los diagramas que puede llegar a crear.

Para instalarlo solo tenemos que hacer: gem install railroad

Ahora ejecutamos este comando en la carpeta de nuestro proyecto: railroad -a -i -o modelos_completo.dot -M

Omnigraffle: La utilidad de creación de diagramas mas potente que he encontrado. Puedes importar los archivos DOT generados por RailRoad, el problema, no es gratuito.

Por ultimo comentar que con VbVisualizer tambien se pueden generar diagramas de la base de datos.

Espero poner mas adelante un post de mis experiencias con estas herramientas, UML y Rails

© 2009 Apuntes Rails. All Rights Reserved.

This blog is powered by Wordpress and the Magatheme Wordpress Theme by Mid MO SEO.