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.