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