Les tâches de râteau des rails permettent-elles d'accéder aux modèles ActiveRecord?

235

J'essaie de créer une tâche de râteau personnalisée, mais il semble que je n'ai pas accès à mes modèles. Je pensais que c'était quelque chose implicitement inclus dans la tâche des 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

gmoniey
la source

Réponses:

410

Compris, la tâche devrait ressembler à:

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

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

gmoniey
la source
4
que signifie cette syntaxe? c'est assigner new_taskà l'environnement actuel? quelle est la valeur actuelle de :environment? Google n'aide pas.
Scott Coates
12
@scoarescoare: l'environnement est ici la dépendance, donc lors de l'exécution new_task, chargez d'abord l'environnement (chargez vos modèles), puis exécutez new_task.
bigpotato
3
@scoarescoare vous pouvez vérifier le document de râteau personnalisé , le premier exemple vous le dira
lazybios
comment réaliser la même chose dans Sinatra?
AMBasra
le nom du modèle doit suivre avec tout et il ne fonctionne pas sans lui comme TodoList.all.each pas TodoList.each idk pourquoi il semble fonctionner?
Kick Buttowski
17

vous pourriez avoir besoin d'exiger votre configuration (qui devrait spécifier tous vos modèles requis, etc.)

par exemple:

require 'config/environment'

Alternativement, vous pouvez simplement les demander séparément, mais vous pourriez avoir des problèmes d'environnement AR non configurés, etc.)

Luke Schafer
la source
5
Cela fonctionnera, mais cela cassera le râteau en général! Après avoir ajouté cette modification, essayez rake -T sans DB disponible. rake -T devrait heureusement fournir une liste de tâches de râteau sans avoir besoin d'accéder à la base de données!
irkenInvader
1
Après cela, vous constaterez que toutes les autres tâches de rake qui nécessitent l'initialisation de l'application (c'est-à-dire rake assets: precompile) échoueront avec "rake aborted! L'application a déjà été initialisée".
brent
11

Lorsque vous commencez à écrire vos tâches de râteau , utilisez un générateur pour les éliminer pour vous.

Par exemple:

rails g task my_tasks task_one task_two task_three 

Vous obtiendrez un stub créé dans lib / tâches 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 de rails, etc. seront disponibles pour l'environnement actuel à partir de chaque bloc de tâches, sauf si vous utilisez l' environnement de production , auquel cas vous devez exiger les modèles spécifiques que vous souhaitez utiliser. Faites-le dans le corps de la tâche. (IIRC cela varie entre les différentes versions de Rails.)

ocodo
la source
2
Ne pourriez-vous pas simplement dire que cela environmentest requis en tant que dépendance, puis dire la syntaxe plutôt que d'encourager l'OP à s'appuyer sur des utilitaires "magiques" qui n'utilisent même pas de magie?
BalinKingOfMoria réintègre les CM le
3

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

namespace :test do
  task new_task: :environment do
    puts Parent.all.inspect
  end
end
apadana
la source
2

La dépendance de l'environnement: est correctement appelée, mais rake peut ne pas encore connaître les autres gemmes dont vos modèles dépendent - dans un cas à moi, '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.

Lex Lindsey
la source
1

Générez la 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 de la logique:

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

Exécutez la tâche ci-dessus à l'aide de la commande ci-dessous:

bundle exec rake test:new_task  

ou

 rake test:new_task
Ni3
la source