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:
- ¿Cómo accedo al entorno actual, o
- ¿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