web-dev-qa-db-fra.com

Charger et utiliser un appareil dans la console Rails

Je me demande s'il y a un moyen de charger et/ou d'utiliser un appareil dans Rails console. En fait, j'aimerais créer un utilisateur à partir de mon appareil users.yml Pour faire des tests sans avoir à passer par toute la "douleur" de faire User.new(:name = "John", :email = "..") à chaque fois.
Je suis actuellement dans un environnement de test (Rails c Rails_ENV=test).

Si ce n'est pas une bonne façon de faire les choses, dites-le s'il vous plaît. Je suis nouveau à Rails donc je suis ici pour apprendre :)

38
Patrick Pruneau

Vous devriez pouvoir charger vos appareils avant d'entrer dans la console. Comme ça:

bin/Rails db:fixtures:load Rails_ENV=test
Rails console test

Cependant, vous ne pourrez toujours pas accéder aux données de votre appareil comme vous le feriez dans un test. Cela charge simplement votre base de données de test avec les données de vos appareils. Il vous faudrait donc toujours faire quelque chose comme:

user = User.find_by(name: "John")

Mais, vous pouvez toujours créer des raccourcis pour ce genre de chose. Vous pouvez ajouter n'importe quel code Ruby que vous souhaitez à votre ~/.irbrc. Je suggère de créer un fichier .railsrc comme décrit ici . Vous pouvez ensuite configurer les choses comme:

john = User.find_by(name: "John")

Alors maintenant, vous pouvez simplement commencer à vous référer à la variable "john" après le chargement de la console. Soit dit en passant, le message auquel j'ai lié montre comment configurer un fichier .railsrc global, mais vous pouvez le configurer de manière à avoir un fichier .railsrc par projet. Ou, si vous voulez quelque chose d'un peu moins sophistiqué, mais facile à faire ... créez simplement un fichier Ruby dans votre projet (peut-être 'shortcuts.rb'). Une fois la console chargée, faire un besoin de "raccourcis".

42
Ryan Sandridge

Peut être en retard ... Rails 4

require 'active_record/fixtures'
ActiveRecord::FixtureSet.create_fixtures(Rails.root.join('test', 'fixtures'), 'users')
33
woto

Vous pouvez également charger des appareils dans votre base de données de développement:

$ rake db:fixtures:load
$ Rails c
> require 'active_record/fixtures'
> john = User.find ActiveRecord::FixtureSet.identify('john')
14
Wojtek Kruszewski

J'avais donc un besoin similaire mais légèrement différent. Je voulais utiliser mes appareils existants (issus de mon test rspec) pour remplir ma base de données de développement. Voici comment je l'ai fait en ajoutant une nouvelle tâche à mon fichier rake (situé dans libs/tasks/*. Rake):

task d_populate: :environment do
  require 'active_record/fixtures'
  fixtures_dir = File.join(Rails.root, '/spec/fixtures') #change '/spec/fixtures' to match your fixtures location
  Dir.glob(File.join(fixtures_dir,'*.yml')).each do |file|
  base_name = File.basename(file, '.*')
  puts "Loading #{base_name}..."
  ActiveRecord::Fixtures.create_fixtures(fixtures_dir, base_name)
  end
end

Si vous combinez cela avec un db: reset, vous pouvez remplir votre environnement de développement à volonté en l'ajoutant également à votre tâche de râteau:

task reseed: [:environment, 'db:reset', 'db:d_populate']

Ensuite, vous pouvez appeler rake db: reseed pour remplir à partir des fichiers YAML du luminaire.

6
hercules08

Vous pouvez charger un appareil dans la console Rails 3.2 comme suit:

require 'active_record/fixtures'

ActiveRecord::Fixtures.create_fixtures FIXTURE_PATH_HERE, MODEL_NAME_HERE
4
jpw

Il est possible de spécifier un autre répertoire de fixture en utilisant la variable FIXTURES_DIR. La valeur doit être relative aux tests/appareils.

$ rake db:fixtures:load Rails_ENV=test FIXTURES_DIR='../../spec/fixtures'

Il est également possible de spécifier un ensemble limité de luminaires

$ rake db:fixtures:load Rails_ENV=test FIXTURES_DIR='../../spec/fixtures' FIXTURES=users,user_roles
3
Fred Willmore