2015-05-01 4 views
5

Я делаю главу 12 учебника hartle. Когда я побежал bundle exec rake db:seed я получил эту ошибку:Не удалось выполнить валидацию на рейке db: seed

ActiveRecord::RecordInvalid: Validation failed: Email has already been taken 

я попробовать запустить

rake db:reset 
rake db:migrate 
rake db:test:prepare 

И наконец

rake db:populate 

, но они не решают проблему. Когда я бегу rake db:populate это дает:

Don't know how to build task 'db:populate' 

Это мой seeds.rb файл:

# Users 
User.create!(name: "Example User", 
      email: "[email protected]", 
      password:    "foobar", 
      password_confirmation: "foobar", 
      admin:  true, 
      activated: true, 
      activated_at: Time.zone.now) 

99.times do |n| 
    name = Faker::Name.name 
    email = "example-#{n+1}@railstutorial.org" 
    password = "password" 
    User.create!(name: name, 
       email: email, 
       password:    password, 
       password_confirmation: password, 
       activated: true, 
       activated_at: Time.zone.now) 
end 

# Microposts 
users = User.order(:created_at).take(6) 
50.times do 
    content = Faker::Lorem.sentence(5) 
    users.each { |user| user.microposts.create!(content: content) } 
end 

# Following relationships 
users = User.all 
user = users.first 
following = users[2..50] 
followers = users[3..40] 
following.each { |followed| user.follow(followed) } 
followers.each { |follower| follower.follow(user) } 

Я думаю, может быть проблема с этой линии email = "example-#{n+1}@railstutorial.org"

+0

Я не вижу проблемы с вашим файлом семян. Вы уверены, что db упал должным образом. Может быть, зайдите в рельсы c и проверьте, нет ли каких-либо проблем. Или попробуйте поймать исключение и определить, какая запись вызывает проблему. – jphager2

ответ

5

Ваша проблема в том, что rake db: reset не только уменьшает и воссоздает базу данных, но и it also migrates and seeds it as well.Поэтому в основном то, что происходит это:

rake db:drop 
rake db:create 
rake db:schema:load # (think of this as running all the migrations you've run before) 
rake db:seed # (creates your 100 database users) 

, а затем запустить:

rake db:migrate # (likely unnecessary, but it causes no harm) 
rake db:test:prepare # (prepares the test database) 
rake db:prepare # (runs the seeds AGAIN and causes your errors) 

Очевидно, что от этого, если вы просто остановить выполнение грабли БД: подготовить команду ваша проблема исчезнет. Однако, чтобы избежать этого в будущем, я настоятельно рекомендую вставить немного логики в ваш файл семени. Это просто Руби, чтобы вы могли обернуть Пользователь создает в, если заявление, например:

unless User.find_by(email: "[email protected]") 
    # create all 100 users 
end 

Это окажется особенно полезным, если у вас есть сайт, на производстве, которые до сих пор использует данные семян (например, SiteSetting Таблица); вам необходимо убедиться, что данные попадают в вашу производственную базу данных, но вы создадите повторяющиеся записи (или ошибки), запускающие семя, без отбрасывания.

В качестве дополнительной справки для ответа на ваш вопрос см. Выбранный ответ на this one.

Надеюсь, это предоставит всю необходимую вам информацию!

+0

Спасибо за ваш ответ ... Я запускаю команды, которые вы упомянули без rake db: подготовьте, но все же ошибка остается ... Я так смущен, я знаю, что делать! – Hanna

+0

Просто для ясности, вы были запущены четыре команды в начале ( 'грабли БД: сброс, грабли БД: мигрировать, грабли БД: тест: подготовка, грабли БД: prepare' ) и получаю сообщение об ошибке на последнем один, правильный? Если это так, просто не запускайте последний. Ошибка, которую вы получаете, состоит в том, что последняя команда является избыточной. – ConnorCMcKee

+0

Нет, я не запускал «rake db: prepare» – Hanna

-1

попробуйте использовать:

если это уже существующий адрес электронной почты, он решит его.

email = "example-#{rand(100000)}@railstutorial.org" 

, и вы также можете увидеть ошибки:

user = User.new(name: "Example User", 
     email: "[email protected]", 
     password:    "foobar", 
     password_confirmation: "foobar", 
     admin:  true, 
     activated: true, 
     activated_at: Time.zone.now) 
user.errors 
user.save if user.valid 
+0

Это не сработало :-( – Hanna

+0

Какова ошибка? –

+0

То же самое: «Не удалось выполнить проверку: электронная почта уже была принята» – Hanna

-1

У вас есть как обманщика и Populator установлен в вашем Gemfile? Скорее всего, это связано с проблемой. Убедитесь, что вы запускали:

gem install populator #From the command line 

и включить его в Gemfile:

gem 'populator' 

Вот ссылка на репозиторий Git https://github.com/ryanb/populator/tree/master

Большая статья здесь также: http://sudharti.github.io/articles/using-faker-and-populator-rails/

1

I'm doing chapter 12 of hartle's tutorial. When I ran bundle exec rake db:seed I got this error:

ActiveRecord::RecordInvalid: Validation failed: Email has already been taken

Когда вы запустите rake db:reset, он засеет данные для вас. Когда вы запустите rake db:seed, будет выбрано исключение, потому что вы используете create! в своем файле seeds.rb. В отличие от create, create! вызывает исключение, когда проверки не выполняются.

Вы можете проверить это, запустив rake db:reset, а затем используя rails console, чтобы проверить свои записи в базе данных.

Есть несколько вещей, которые вы можете сделать, чтобы предотвратить это, но почему бы вам, когда ваши данные уже есть?

When I run rake db:populate it gives:

Don't know how to build task 'db:populate'

Если вы не определите сами, нет рейка task имени db:populate.

Смежные вопросы