2009-05-18 4 views
199

Estoy tratando de crear una tarea de rake personalizada, pero parece que no tengo acceso a mis modelos. Pensé que esto era algo implícitamente incluido con la tarea de rieles.¿Las tareas de rastrillar raíles proporcionan acceso a los modelos de ActiveRecord?

Tengo el siguiente código en lib/tareas/test.rake:

namespace :test do 
    task :new_task do 
    puts Parent.all.inspect 
    end 
end 

Y aquí es lo que parece mi padre modelo como:

class Parent < ActiveRecord::Base 
    has_many :children 
end 

Es un ejemplo bastante simple, pero recibe el siguiente error:

/> rake test:new_task 
(in /Users/arash/Documents/dev/soft_deletes) 
rake aborted! 
uninitialized constant Parent 

(See full trace by running task with --trace) 

¿Alguna idea? Gracias

Respuesta

16

puede que tenga que requieren que la configuración (que debe especificar todos sus modelos requeridos, etc.)

por ejemplo:

require 'config/environment' 

, alternativamente, usted puede requerir que cada separado, pero es posible que tenga el medio ambiente emite AR no instale etc)

+5

Esto funcionará, ¡pero romperá el rastrillo en general! Después de agregar este cambio, intente rake -T sin una base de datos disponible. rake -T debería proporcionar una lista de tareas de rake sin necesidad de acceder a la base de datos. – irkenInvader

+1

Después de hacer esto, encontrará que cualquier otra tarea de rake que requiera inicializar la aplicación (es decir, activos de rake: precompilación) fallará con "rake aborted! La aplicación ya se ha inicializado". – brent

356

lo descubrió, la tarea debe ser similar:

namespace :test do 
    task :new_task => :environment do 
    puts Parent.all.inspect 
    end 
end 

Aviso la dependencia => :environment añadido a la tarea

+2

¿Qué significa esta sintaxis?¿Está asignando 'new_task' al entorno actual? ¿Cuál es el valor actual de ': environment'? google no está ayudando –

+9

@scoarescoare: el entorno aquí es la dependencia, por lo que al ejecutar 'new_task', primero cargue el entorno (cargue sus modelos) y luego ejecute new_task. – Edmund

+2

@scoarescoare puede consultar [doc. Rake personalizado] (http://guides.rubyonrails.org/command_line.html#custom-rake-tasks), el primer ejemplo le dirá – lazybios

11

Cuando comience a escribir su rastrillo tareas, usar un generador de código auxiliar a cabo para usted.

Por ejemplo:

rails g task my_tasks task_one task_two task_three 

Vas a conseguir un trozo creada en lib/tareas llamados my_tasks.rake (obviamente utiliza su propio espacio de nombres.) ¿Qué tendrá este aspecto:

namespace :my_tasks do 

    desc "TODO" 
    task :task_one => :environment do 
    end 

    desc "TODO" 
    task :task_two => :environment do 
    end 

    desc "TODO" 
    task :task_three => :environment do 
    end 

end 

Toda su los modelos de raíles, etc. estarán disponibles para el entorno actual desde dentro de cada bloque de tareas, a menos que esté utilizando el entorno de producción, en cuyo caso debe requerir los modelos específicos que desea usar. Haz esto dentro del cuerpo de la tarea. (IIRC esto varía entre las diferentes versiones de Rails.)

+1

¿No podría decir que 'environment' se requiere como una dependencia y luego decir la sintaxis en lugar de alentar al OP a confiar en utilidades" mágicas "que ni siquiera usan magia? – BalinKingOfMoria

1

La dependencia del entorno es bastante correcta, pero aún no se conocen otras gemas de las que dependen sus modelos, en mi caso, 'protected_attributes'.

La respuesta es ejecutar:

bundle exec rake test:new_task 

Esto garantiza que el ambiente incluye cualquier gemas especificados en su Gemfile.

Cuestiones relacionadas