arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

Tareas con Ruby on Rails

Eduardo Ismael Garcia

Full Stack Developer at Código Facilito.

av_timer 3 Min. de lectura

remove_red_eye 7976 visitas

calendar_today 04 Julio 2019

Una de los principales features que nos ofrece Ruby on Rails junto con Rake es la posibilidad de crear, programar y ejecutar tareas. Las tareas pueden ser procesos sencillos como lo es el envío de correos electronicos, respaldo de información, actualización de registros, hasta cosas un poco más complejas, por ejemplo, realizar reportes. 😓

Si has utilizado Ruby on Rails con anterioridad, muy probablemente, te resulte familiar el siguiente comando.

rake db:migrate

Bien, pues dejame decirte que con esa sentencia estamos ejecutando una tarea de Rails. 😎

Rails por default ya nos provee de una gran cantidad de tareas.

logo ruby on rails

Crear y ejecutar tareas

Crear una tarea es sumamente sencillo, basta con ejecutar el siguiente comando.

rails generate task namespace nombre_de_la_tarea

En mi caso generó una tarea llamada say_hello dentro dentro del namespace codigofacilito.

rails generate task codigofacilito say_hello

Al ejecutar el comando obtenemos como resultado un nuevo archivo .rb dentro de la carpeta lib/taks.

El archivo contendría la siguiente estructura.

namespace :codigofacilito do
  desc "TODO"
  task say_hello: :environment do
  end

end

Otra forma de definir una tarea es de la siguiente manera (Esta me agrada más).

task :say_hello do
end

Ahora, programemos algo bastante sencillo, un clásico hola mundo.

namespace :codigofacilito do
  desc "Se debe imprimir en consola el mensaje: Hola Mundo"

  task say_hello: :environment do
    puts "Hola Mundo"
  end
end

Para llamar a la tarea basta con ejecutar el siguiente comando.

bin/rake codigofacilito:say_hello

Colocamos el namespace dos puntos y el nombre de la tarea.

Es importante mencionar que dentro de un mismo namespace podemos tener la n cantidad de tareas que necesitemos, claro, todas ellas deben tener cierto grado de relación. Siempre tengamos nuestro código lo más ordenado posible. 😛

rails generate task namespace tarea1 tarea2 tarea3  etc...

Algo que me agrada mucho de las tareas es la posibilidad de ejecutar jobs y pruebas unitarias.

task :update_progress => :environment do
    UpdateProgressJob.set(wait: 10.seconds).perform_later
end

En este caso la lógica la colocamos dentro de nuestro job, la tarea de lo único que se encarga es de ejecutarlo.

Comandos básicos

Rake nos ofrece una serie de comandos los cuales serán de mucha ayuda al momento de trabajar con tareas.

  • rake -T (Lista todas las tareas en la aplicación)
  • rake -P (Lista todas las tareas en la aplicación junto con sus dependencias)

Ejemplos

#Listamos todas las tareas
rake -T
#Listamos todas las tareas del namespace codigofacilito
rake -T codigofacilito

Concatenar tareas

En ocasiones tendremos la necesidad de crear tareas las cuales dependan de otras. En esos caso debemos modificar un poco la estructura de nuestras tareas, veamos.

desc "Imprime en consola task1"
  task task1: :environment do
    puts "task1"
  end

  desc "Ejecuta la tarea task1 e imprime en consola task2"
  task :task2 => :task1 do
    puts "task2"
  end

En este caso indicamos que la tarea task2 se ejecutará justo después de finalizar la tarea task1.

rake codigofacilito2:task2
task1
task2

Si nuestra tarea depende de más de una, entonces nos apoyamos de una lista.

desc "Imprime en consola task1"
  task task1: :environment do
    puts "task1"
  end

  desc "Imprime en consola task2"
  task task2: :environment do
    puts "task2"
  end

  desc "Ejecuta task1, task2 e imprime en consola task3"
  task :task3 => [:task1, :task2] do
    puts "task3"
  end

El orden de ejecución es de izquierda a derecha.

Si debemos ejecutar tareas que se encuentran en un namespace diferente simplemente lo indicamos mediante un string.

task :task2 => 'namespace:task1' do

Pasando argumentos

Aunque las tareas sean procesos bien definidos muy probablemente necesiten de ciertos parámetros para su correcta ejecución. Afortunadamente Rake tiene esto está cubierto. 😯

  desc "Imprime en consola el valor del nombre "
  task :task4, [:first_name, :last_name] do |t, args|
    puts "Hola #{args.first_name} #{args.last_name}"
  end

Para este ejemplo definimos una nueva tarea con dos parámetros. first_name y last_name. Tendremos acceso a dichos valores mediante el objeto args.

Los parámetros los colocaremos dentro de una lista, separados mediante una coma.

Para llamar a la función y pasar los argumentos simplemente colocamos los valores dentro de una lista y separamos los valores mediante una coma. Ten mucho cuidado de no dejar espacios entre los argumentos.

rake codigofacilito2:task4['Codi','Facilito]