Question

(Ceci est vraiment une question de débutant à propos Rake & Rails et dépendances en général. Essayer d'envelopper la tête autour de la façon dont tout cela va ensemble)

En fait, je veux une tâche Rake qui agit comme seed.rb mais est appelé séparément. Il ajoute des données de test pour l'environnement de développement, alors que mon seed.rb fournit des données de base pour tous les environnements.

Le script, family_seed.rb, utilise factorygirl pour générer des enregistrements. Il ressemble à ceci:

require File.expand_path('../../config/environment', __FILE__)
require './spec/factories'

Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')

Il fonctionne très bien avec bundle exec "ruby db/family_seeds.rb", mais ma question est de savoir comment le configurer avec râteau. le tout doit être placé dans une tâche Rake? Comment pourrais-je, au contraire, mettre en place une tâche qui appellerait le script, tout en veillant à ce que l'environnement de développement Rails est disponible quand il fonctionne? J'essaie non seulement de faire le travail, mais de le faire d'une manière « droit ».

Était-ce utile?

La solution

Une façon d'aborder ce serait de créer une classe ou d'un module dans lib (ce qui facilite à des tests d'écriture pour, et rend le code plus réutilisable):

require '../spec/factories'

class FamilySeed

  def self.seed
    raise "Don't run this in production!" if Rails.env.production?

    Family.delete_all
    Member.delete_all
    zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
    blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
  end

end

Comment créer la tâche rake:

require 'family_seed'

namespace :seed do
  task :families => :environment do
    FamilySeed.seed
  end
end

Je serais prudent avec permettant d'être trop librement utilisé des choses comme Family.delete_all et Member.delete_all. Vous pouvez facilement vous tirer dans le pied plus tard en appelant quelque chose que vous ne vouliez pas sur une db de production.

Comment faire pour exécuter la tâche rake:

Exécuter dans votre commande comme avec ce qui suit:

bundle exec rake seed:families

Autres conseils

Créer une tâche de râteau et nécessitent: environnement

task :delete_all => :environement do
  require Rails.root.join('spec/factories')
  Family.delete_all
  Member.delete_all
  zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
  blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
end

Une fois que vous pouvez exécuter cette tâche rake delete_all

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top