tutorial sintaxis rails español ejemplos caracteristicas ruby-on-rails ruby-on-rails-3 cron rake whenever

ruby-on-rails - sintaxis - ruby on rails tutorial español



Como detectar el entorno de Rails en su interior cada vez. (5)

Es probable que esta pregunta solo tenga sentido si conoce la gema de whenever que cree trabajos cron .

Para mi aplicación, quiero usarla en todos los entornos, incluidas las pruebas y el desarrollo .
Mi schedule.rb ve así:

set :output, { :error => "#{path}/log/error.log", :standard => "#{path}/log/cron.log" } set :environment, Rails.env.to_sym every 5.minutes do rake ''db:activity:synchronize'' end

pero falla en Rails.env.to_sym ( y lo mismo significa RAILS_ENV ):

/home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `eval'': uninitialized constant Whenever::JobList::Rails (NameError) from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `eval'' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `initialize'' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever.rb:15:in `new'' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever.rb:15:in `cron'' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/command_line.rb:41:in `run'' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/command_line.rb:8:in `execute'' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/bin/whenever:38:in `<top (required)>'' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/bin/whenever:19:in `load'' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/bin/whenever:19:in `<main>''

Entonces, mi pregunta básicamente se reduce a:

  1. ¿Cómo accedo al entorno actual, o
  2. ¿Qué debo hacer para usar whenever en todos los entornos?

Al menos en la versión más reciente de cada vez que sea posible acceder al entorno con @environment . Por ejemplo, si siempre desea generar solo entradas cron para algunos trabajos en producción:

case @environment when ''production'' every 1.day, :at => ''0:00 am'' do rake "some:task" end end


El mensaje de error sugiere que Rails no está definido. es decir, el marco no se carga cuando se está preguntando con qué entorno se están ejecutando los rieles.

De hecho, al mirar el código de Siempre que parezca que los rieles no es un requisito (es decir, se puede instalar y ejecutar Siempre que no se instalen rieles en su sistema). Por lo tanto, no hay forma de mirar el entorno de los rieles (por lo que puedo decir)


Según lo recomendado por el autor de la gema , la solución es pasar el entorno actual como una variable :

$ whenever --set environment=test 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c ''cd /home/marius/uxolo && RAILS_ENV=test rake db:activity:synchronize --silent >> /home/marius/uxolo/log/cron.log 2>> /home/marius/uxolo/log/error.log'' $ whenever --set environment=development 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c ''cd /home/marius/uxolo && RAILS_ENV=development rake db:activity:synchronize --silent >> /home/marius/uxolo/log/cron.log 2>> /home/marius/uxolo/log/error.log''

Y Chris Bailey tiene razón: Whenever que no se carga el entorno de Rails.


Tomé la implementación de Rails.env que encontré here (haciendo clic en "source"), y la usé para inicializar el módulo ::Rails al comienzo de config/schedule.rb

eval %Q(module ::Rails def self.env ''#{@environment}'' || ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development" end end )

Esto crea el módulo Rails y hace que su entorno devuelva lo que usted suministró como --set environment=... en la línea de comandos de " --set environment=... , como sugiere el autor del script.

Sin embargo, cada vez que se establece el @environment en producción por defecto , este "o" grande puede no ser del todo útil.

Ahora la llamada de Rails.env en la secuencia de comandos Cuando sea que funcione. Lo que fue más importante en mi caso, también funcionó en otros scripts que incluí en schedule.rb , como el que cargó application.yml .

PS La llamada eval se usa para acceder a @environment disponible en el alcance del script schedule.rb desde la definición de un módulo.


Una variación de la primera respuesta a una pregunta similar funcionó para mí. Añadir

require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

en la parte superior de schedule.rb y podrás llamar a Rails.env para acceder al entorno actual de Rails.

Nota: la ruta anterior sería diferente si su archivo environment.rb no está en /app/config