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
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
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.
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.)
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.
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
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