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

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


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


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


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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.