2016-05-08 21 views
0

Ich bin auf der Suche nach meiner seeds.rb Datei refaktorieren. Daher verlasse ich mich stark auf die gem faker Daten zu füllen.Faker Juwel mit samen.rb

Zuerst bin ich zu erzeugen Benutzer, wie folgt aus:

# --== Generate Sample Users 
    user_list = [ 
    [ "Name", "Lastname", "Password", 't', "[email protected]", "Password"], 
    [ "Mortimer", "Snerd", "Secret", 'f', "[email protected]", "Secret"] 
    5.times.do 
     name = Faker::Name.first_name 
     surname = Faker::Name.last_name 
     password = Faker::Internet.password(10) 
     [ name, surname, 'f', Faker::Internet.email(name + "." + surname), 'f', password, password] 
    end 
    ] 
    user_list.each do |name, surname, admin, email, password, password| 
     User.create(name:name, surname:surname, admin:admin, email:email, password:password, password_confirmation:password) 
    end 

Allerdings bin ich einen Syntaxfehler bekommen: unexpected tINTEGER, expecting ']' 5.times.do

Was mache ich falsch hier?

+0

Hinweis: Es erwartet ein ']' am Ende der 'user_list' Deklaration. – tadman

Antwort

1

Zunächst ist 5.times.do keine gültige Syntax. 5.times gibt ein Enumerable-Objekt zurück, aber do ist keine Methode. Ich denke du meinst hier do als Block.

Auch ein Block times verläuft nicht ein Array zurück, es gibt nur das letzte Element aus dem Block zurückgeführt, so dass Sie nicht wirklich Ihr user_list Array

user_list = [ 
    [ "Name", "Surname", "Password", 't', "[email protected]", "Password"], 
    [ "Mortimer", "Snerd", "Secret", 'f', "[email protected]", "Secret"] 
] 

5.times.do 
    name = Faker::Name.first_name 
    surname = Faker::Name.last_name 
    password = Faker::Internet.password(10) 

    # Add user to user_list 
    user_list << [ name, surname, 'f', Faker::Internet.email(name + "." + surname), 'f', password, password] 
end 

user_list.each do |name, surname, admin, email, password, password_confirmation| 
    User.create(name: name, surname: surname, admin: admin, email: email, password: password, password_confirmation: password_confirmation) 
end 

Schließlich ändern, können Sie Ich möchte auf Faker für E-Mails verzichten und find_or_create anstelle von create verwenden, um die Erstellung zu verhindern, wenn ein Benutzer mit einer bestimmten E-Mail bereits existiert. Ihr seeds.rb sollte wirklich idempotent sein (mehr als einmal laufen sollte keine Nebenwirkungen haben).

+0

Was würden Sie anstelle von Faker vorschlagen? – Matteo

+0

Übergeben Sie 'i' einfach an den Block von' 5.x.do' und verwenden Sie etwas wie 'email =" seeduser#{i}@example.com "'. Dann benutze 'User.find_or_create_by (email: email, ...)', damit du nicht jedes Mal neue Benutzer erstellst. –

+0

Warum funktioniert das nicht? '5.times.do | i |' ' name = Faker :: Name.first_name' ' Nachname = Faker :: Name.last_name' 'password = Faker :: Internet.password (10)' ' user_list << [Name, Vorname, 'f', Faker :: Internet.email (Name + "." + Nachname), 'f', Passwort] ' ' end' – Matteo