Rails двухступенчатая регистрация с устройством - ошибки

Я пытаюсь настроить двухэтапный процесс регистрации с использованием Devise в Rails и следовал этому уроку от Claudio Marai. Когда я ввожу адрес электронной почты в форму (первый шаг), я получаю сообщение об ошибке, сообщающее, что произошла ошибка маршрутизации и что она не может найти RegistrationsController

Started POST "/users" for 127.0.0.1 at 2012-05-03 22:50:59 -0400

ActionController::RoutingError (uninitialized constant RegistrationsController):
  activesupport (3.2.1) lib/active_support/inflector/methods.rb:229:in `block in constantize'
  activesupport (3.2.1) lib/active_support/inflector/methods.rb:228:in `each'
  activesupport (3.2.1) lib/active_support/inflector/methods.rb:228:in `constantize'
  .
  .
  .

Я полагал, что это было связано с присутствием :registrations => "registrations" в моем routes.rb file как описано в первом шаге урока. Затем я попробовал два варианта, которые привели к одной и той же ошибке. Во-первых, я удалил :registrations => "registrations" от routes.rb file, Когда это не сработало, я снова вставил строку и добавил registrations_controller.rb к controllers каталог, который выглядел так:

class RegistrationsController < Devise::RegistrationsController
end

Я полагал, что оба варианта будут иметь одинаковый эффект, но я все равно попробовал их.

Я получил следующую ошибку:

Started POST "/users" for 127.0.0.1 at 2012-05-03 22:47:29 -0400
Processing by Devise::RegistrationsController#create as HTML
  Parameters: {"utf8"=>"?", "authenticity_token"=>"ttPBRPRLVzPBHcDDKRJbimv0Yp/egdK5qBkIvBTL4Ig=", "user"=>{"email"=>"test@email.com"}, "x"=>"0", "y"=>"0"}
   (0.6ms)  begin transaction
  User Exists (1.5ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'test@email.com' LIMIT 1
  CACHE (0.0ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'test@email.com' LIMIT 1
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = '8tA1jakpAXNK4Piz7J6R' LIMIT 1
  SQL (14.0ms)  INSERT INTO "users" ("confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "fb_id", "fb_token", "first_name", "last_name", "last_sign_in_at", "last_sign_in_ip", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "state", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["confirmation_sent_at", Thu, 03 May 2012 22:47:30 EDT -04:00], ["confirmation_token", "8tA1jakpAXNK4Piz7J6R"], ["confirmed_at", nil], ["created_at", Thu, 03 May 2012 22:47:30 EDT -04:00], ["current_sign_in_at", nil], ["current_sign_in_ip", nil], ["email", "test@email.com"], ["encrypted_password", nil], ["fb_id", nil], ["fb_token", nil], ["first_name", nil], ["last_name", nil], ["last_sign_in_at", nil], ["last_sign_in_ip", nil], ["remember_created_at", nil], ["reset_password_sent_at", nil], ["reset_password_token", nil], ["sign_in_count", 0], ["state", nil], ["updated_at", Thu, 03 May 2012 22:47:30 EDT -04:00]]
SQLite3::ConstraintException: constraint failed: INSERT INTO "users" ("confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "fb_id", "fb_token", "first_name", "last_name", "last_sign_in_at", "last_sign_in_ip", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "state", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
   (0.3ms)  rollback transaction
Completed 500 Internal Server Error in 441ms

ActiveRecord::StatementInvalid (SQLite3::ConstraintException: constraint failed: INSERT INTO "users" ("confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "fb_id", "fb_token", "first_name", "last_name", "last_sign_in_at", "last_sign_in_ip", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "state", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)):
  sqlite3 (1.3.5) lib/sqlite3/statement.rb:108:in `step'
  sqlite3 (1.3.5) lib/sqlite3/statement.rb:108:in `block in each'
  sqlite3 (1.3.5) lib/sqlite3/statement.rb:107:in `loop'
  sqlite3 (1.3.5) lib/sqlite3/statement.rb:107:in `each'
  .
  .
  .

Вышеупомянутая ошибка меня действительно смутила!

С той же формой, когда я добавляю password а также password_confirmation поля, а затем все идет гладко - учетная запись пользователя создается и электронное письмо с подтверждением отправляется пользователю со ссылкой для подтверждения.

Буду признателен за любую помощь по этому поводу - спасибо! я использую Ruby 1.9.3-p125 а также Rails 3.2.1

1 ответ

Решение

Проблема не в проверке Rails, а в нарушении ограничения базы данных.

Скорее всего, если миграция таблицы ваших пользователей была сгенерирована Devise, тогда схема включает в себя следующее:

"encrypted_password" varchar(128) DEFAULT '' NOT NULL

SQL, который вызывает ConstraintException, включает в себя следующее (для удобства чтения):

SQL (14.0ms)  INSERT INTO "users" (..., "encrypted_password", ...) VALUES (..., ?, ...)  [..., ["encrypted_password", nil], ...]

Итак, что-то говорит вашему адаптеру базы данных, чтобы установить encrypted_password = nil,

Вы должны быть в состоянии обойти это либо запустить миграцию, которая удаляет ограничение NOT NULL на encrypted_passwordили сделайте, как вы сделали, передайте encrypted_password, но убедитесь, что он пуст на первом шаге, но присутствует на втором.

Другие вопросы по тегам