Не удалось выполнить валидацию на rake db: seed

Я делаю главу 12 учебника hartle. Когда я побежал bundle exec rake 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: "example@railstutorial.org",
             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"

+5
источник поделиться
4 ответа

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

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)

Очевидно, из этого, если вы просто прекратите выполнение рейка db: подготовьте команду, ваша проблема исчезнет. Однако, чтобы избежать этого в будущем, я настоятельно рекомендую вставить немного логики в ваш файл семени. Это просто Ruby, поэтому вы можете обернуть создание User в инструкции if, например:

unless User.find_by( email: "example@railstutorial.org" )
  # create all 100 users
end

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

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

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

+5
источник

Я делаю главу 12 учебника hartle. Когда я запустил пакет exec rake db: seed Я получил эту ошибку:

ActiveRecord:: RecordInvalid: сбой проверки: электронная почта уже была принято

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

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

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

Когда я запускаю rake db: populate, он дает:

Не знаю, как построить задачу 'db: populate'

Если вы не определяете его самостоятельно, нет функции rake с именем db:populate.

+1
источник

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

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

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

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

user = User.new(name:  "Example User",
         email: "example@railstutorial.org",
         password:              "foobar",
         password_confirmation: "foobar",
         admin:     true,
         activated: true,
         activated_at: Time.zone.now)
user.errors
user.save if user.valid
-1
источник

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

gem install populator #From the command line

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

gem 'populator'

Вот ссылка на Git repo https://github.com/ryanb/populator/tree/master

Отличная статья здесь: http://sudharti.github.io/articles/using-faker-and-populator-rails/

-1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос