En proyectos Ruby o Rails, cuando queremos ejecutar tareas en el entorno (no en el software como tal) nos valemos de las rake task. Comandos que permiten recrear archivos, insertar o limpiar archivos y datos.
Ahora, cuando creamos nuestras rake tasks personalizadas es muy usual que sean bastante sencillas y triviales pero qué pasa cuándo necesitan un poco más de personalización, cuándo necesitamos pasar argumentos a estas, ¿es posible hacerlo? Claro que sí.
Una rake task la ejecutamos con el comando rake
acompañado del nombre de esta. Ejemplo:
$ rake tmp:clear
Dicha tarea limpiará los archivos en la carpeta tmp/
de un proyecto Ruby on Rails.
Resulta que es sencillo pero es poco intuitivo escribir una rake taks que acepte parámetros. La forma es así:
task :name, [:arg_1, :arg_2] => :environment do |task, args|
# some code
end
La clave está en el segundo argumento de la función task
. El primero es el nombre de la tarea y el segundo es una lista de argumentos.
Nota que aunque sea un solo argumento, hay que enviarlo dentro de un array.
Como la declaración de task
es un bloque, los parámetros del bloque son task
y args
. task
es una instancia de Rake::Task
y args
es una instancia de Rake::TaskArguments
. Esto último quiere decir que args
puede parecer un hash pero no lo es. Tiene comportamiento similar por lo que uno podría hacer esto:
task :name, [:first_name, :last_name] => [:pre_name] do |t, args|
args.with_defaults(:first_name => "John", :last_name => "Dough")
puts "First name is #{args.first_name}"
puts "Last name is #{args.last_name}"
end
Y funcionará sin problemas.
Sobre Rake::Task y Rake::TaskArguments.
Finalmente, una rake task como la anterior se invoca así:
$ rake name[Francisco,Quintero]
Visto en Stack Overflow.