2016-05-08 3 views
0

Я ищу рефакторинг моего файла seeds.rb. Таким образом, я очень полагаюсь на gem faker для заполнения данных.Faker gem with seeds.rb

Сначала я генерируя пользователей, как это:

# --== 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 

Однако я получаю ошибку синтаксиса: unexpected tINTEGER, expecting ']' 5.times.do

Что я делаю неправильно здесь?

+0

Подсказка: ожидается, что '' '' 'в конце объявления' user_list'. – tadman

ответ

1

Во-первых, 5.times.do недопустим синтаксис. 5.times возвращает объект Enumerable, но do не является методом. Я думаю, вы хотите использовать do в качестве блока здесь.

Кроме того, проходя блок times не возвращает массив, он просто возвращает последний элемент возвращается из блока, так что вы на самом деле не модифицируя user_list массив

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 

Наконец, вы можете хотите отказаться от использования Faker для электронной почты и использовать find_or_create вместо create, чтобы предотвратить создание, если пользователь уже существует с данным электронным письмом. Ваш seeds.rb действительно должен быть идемпотентным (запуск его более одного раза не должен иметь побочных эффектов).

+0

Что бы вы предложили вместо Факера? – Matteo

+0

Просто передайте 'i' в блок' 5.times.do' и используйте что-то вроде 'email =" seeduser#{i}@example.com "'. Затем используйте 'User.find_or_create_by (email: email, ...)', чтобы вы не создавали новых пользователей каждый раз. –

+0

Так почему же не работает следующая работа? '5.times.do | я |' ' имя = Факер :: Name.first_name' ' фамилия = Факер :: Name.last_name' 'пароль = Факер :: Internet.password (10)' ' user_list << [name, surname, 'f', Faker :: Internet.email (имя + "." + фамилия), 'f', пароль] ' ' end' – Matteo