Двухэтапная регистрация Rails с devise - Ошибки

Я пытаюсь настроить двухэтапный процесс регистрации с помощью Devise в Rails и следую этому руководство Клаудио Мараи. Когда я ввожу адрес электронной почты в форму (первый шаг), я получаю сообщение об ошибке, говорящее о том, что произошла ошибка маршрутизации и что не удалось найти 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"=>"[email protected]"}, "x"=>"0", "y"=>"0"}
   (0.6ms)  begin transaction
  User Exists (1.5ms)  SELECT 1 FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1
  CACHE (0.0ms)  SELECT 1 FROM "users" WHERE "users"."email" = '[email protected]' 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", "[email protected]"], ["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


person Aayush Kumar    schedule 04.05.2012    source источник
comment
Этот урок кажется довольно подробным, вы уверены, что ничего не пропустили? А именно, переопределить метод password_required? внутри модуля Devise?   -  person Ashitaka    schedule 08.05.2012
comment
@Ashitaka Как вы можете себе представить, я уже прошел этот урок 20 раз! :P У меня есть метод password_required? в одном из файлов initializer, как объясняется в учебнике.   -  person Aayush Kumar    schedule 08.05.2012


Ответы (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, но просто убедитесь, что он пуст на первом шаге, но присутствует в второй шаг.

person Mark Paine    schedule 08.05.2012
comment
Вау - отличный улов! Это сработало! Я удивлен, что в учебнике об этом не говорилось?! :о - person Aayush Kumar; 08.05.2012