web-dev-qa-db-fra.com

Les tâches de ratissage de Rails donnent-elles accès aux modèles ActiveRecord?

J'essaie de créer une tâche de rake personnalisée, mais il semble que je n'ai pas accès à mes modèles. Je pensais que cela faisait implicitement partie de la tâche Rails.

J'ai le code suivant dans lib/tasks/test.rake:

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

Et voici à quoi ressemble mon modèle parent:

class Parent < ActiveRecord::Base
  has_many :children
end

C'est un exemple assez simple, mais j'obtiens l'erreur suivante:

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

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

Des idées? Merci

212
gmoniey

Compris, la tâche devrait ressembler à:

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

Notez la dépendance => :environment ajoutée à la tâche

379
gmoniey

vous devrez peut-être exiger votre configuration (ce qui devrait spécifier tous vos modèles requis, etc.)

par exemple:

require 'config/environment'

alternativement, vous pouvez juste exiger chacun séparément, mais vous pouvez avoir des problèmes d’environnement, le RA n’est pas configuré etc.

16
Luke Schafer

Lorsque vous commencez à écrire vos rake tâches, utilisez un générateur pour les écraser pour vous.

Par exemple:

Rails g task my_tasks task_one task_two task_three 

Vous obtiendrez un stub créé dans lib/tasks appelé my_tasks.rake (utilisez évidemment votre propre espace de noms.) Qui ressemblera à ceci:

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

Tous vos modèles Rails, etc. seront disponibles pour l’environnement actuel à partir de chaque bloc de tâches, sauf si vous utilisez l’environnement production , auquel cas vous devez exiger les modèles spécifiques que vous souhaitez utiliser. Faites cela dans le corps de la tâche. (IIRC cela varie entre les différentes versions de Rails.)

11
ocodo

La dépendance à l'environnement: est correctement appelée, mais rake risque de ne pas connaître les autres gemmes dont dépendent vos modèles - dans un cas, 'protected_attributes'.

La réponse est d'exécuter:

bundle exec rake test:new_task

Cela garantit que l'environnement inclut toutes les gemmes spécifiées dans votre Gemfile.

2
Lex Lindsey

Avec la nouvelle syntaxe de hachage Ruby (Ruby 1.9), l'environnement sera ajouté comme ceci à la tâche rake: 

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

Générer une tâche en utilisant la commande ci-dessous (espace de noms avec le nom de la tâche):

Rails g task test new_task

Utilisez la syntaxe ci-dessous pour ajouter une logique:

namespace :test do
  desc 'Test new task'
  task new_task: :environment do
    puts Parent.all.inspect
  end
end

Exécuter la tâche ci-dessus en utilisant la commande ci-dessous:

bundle exec rake test:new_task  

ou

 rake test:new_task
0
Ni3