Сообщение об ошибке после реализации has_secure_password

Я разработал несколько тестов в Rails, которые отлично работают. Затем я добавил:

  • В файле модели: has_secure_password
  • В файле Gem: gem 'bcrypt', '3.1.7' (после установки пакета он отображается в Gemfile.lock)
  • Я добавил password_digest в качестве строки в файл миграции (и после миграции он действительно отображается в schema.rb)

И я добавил пароль и пароль_подтверждение для настройки в тестовом файле:

  def setup
    @user = User.new(email: "[email protected]",
                     username: "example user",
                     firstname: "Allan",
                     location: "Europe",
                     password: "foobar", 
                     password_confirmation: "foobar")
  end

Теперь, когда я запускаю rake test, я получаю сообщения об ошибках:

NoMethodError: undefined method 'password_digest=' for #<User:0x00000002f9c020> test/models/user_test.rb:6:in 'setup'.

Строка 6 относится к строке @user = User.new...

Таким образом, похоже, что драгоценный камень и дополнительный столбец реализованы правильно, и все же я получаю это сообщение об ошибке. Кто-нибудь знает, что может быть причиной?


person Nick    schedule 10.04.2015    source источник
comment
Вы создали новую миграцию или изменили существующую миграцию?   -  person BroiSatse    schedule 11.04.2015
comment
Сначала я запустил bundle exec rake db:migrate VERSION=0, а затем bundle exec rake db:migrate, но это не помогло.   -  person Nick    schedule 11.04.2015
comment
На самом деле это не отвечает на мой вопрос, поэтому я предполагаю, что вы изменили существующую миграцию. :) Это приведет к тому, что ваша тестовая база данных не будет синхронизирована с вашей базой данных разработки. Запустите rake db:test:prepare — он загрузит ваш текущий schema.rb в вашу тестовую базу данных.   -  person BroiSatse    schedule 11.04.2015
comment
Это решило это! Пока не знаю, почему это так и почему того, что я сделал, было недостаточно, но я собираюсь провести небольшое исследование того, что именно делает rake db:test:prepare.   -  person Nick    schedule 11.04.2015
comment
Пожалуйста, добавьте это как ответ   -  person Nick    schedule 11.04.2015


Ответы (1)


Похоже, вы изменили и повторно запустили существующую миграцию. В этом случае ваша тестовая база данных не синхронизирована с вашей базой данных dev. Вам нужно загрузить свою схему в тестовую базу данных с помощью:

rake db:test:prepare

Объяснение:

При разработке на рельсах у вас есть две совершенно отдельные среды — тестовая и разработка. Разработка — это среда, которую вы используете для просмотра того, что вы написали — это значение по умолчанию для rails s и rails c. Тестовая среда используется только для тестирования. Эти среды имеют две отдельные базы данных.

До недавнего времени каждый раз, когда вы создавали миграцию, вам приходилось запускать ее дважды, по одному разу для каждой среды (чтобы обе базы данных были синхронизированы) или, по крайней мере, загружать схему базы данных для проверки базы данных. Новейшая версия рельсов немного умнее - перед запуском тестов она проверяет, были ли выполнены все миграции, а затем соответствует ли версия тестовой базы данных базе данных dev. Если нет, он обновит тестовую базу данных из схемы.

Поскольку вы повторно запустили существующую миграцию, обе базы данных дали одну и ту же версию, поэтому ваша тестовая база данных не обновлялась автоматически, поэтому ее необходимо обновлять вручную.

person BroiSatse    schedule 10.04.2015