ОБНОВЛЕНО Я использую Devise 1.4.9 для аутентификации, и моя модель пользователя, сгенерированная Devise, похоже, не улавливает исключения, которые выдает БД, когда я пытаюсь создать нового пользователя с адрес электронной почты, который уже существует в БД. Следуя совету Циклона (см. Ответ ниже), мой код для создания нового пользователя ...
class Api::RegistrationsController < Api::BaseController
respond_to :json
def create
user = User.new(params[:user])
user.ensure_authentication_token!
if user.valid?
user.save
render :json=> user.as_json(:auth_token=>user.authentication_token, :email=>user.email, :user_id=>user.id), :status=>201
return
else
warden.custom_failure!
render :json=> user.errors, :status=>422
end
end
end
Сгенерированная Devise миграция включает индекс для атрибута электронной почты, включая проверку уникальности ...
add_index :users, :email, :unique => true
А вот и пользовательская модель ...
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :token_authenticatable
attr_accessible :email, :password, :password_confirmation, :remember_me, :authentication_token
validates_uniqueness_of :email
def ensure_authentication_token!
reset_authentication_token! if authentication_token.blank?
end
def as_json(options={})
super(:only => [:email, :authentication_token, :id])
end
end
... Я хотел бы, чтобы база данных выдавала ошибку во время сохранения, если указанный адрес электронной почты уже существовал в БД, чтобы Rails перехватил его и выполнил блок кода else, чтобы получить 422 и описание проблемы. Это не так, вместо этого я получаю ошибку SQLException и сбой ...
ActiveRecord::StatementInvalid (SQLite3::ConstraintException: constraint failed: INSERT INTO "users" ("authentication_token", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "last_sign_in_at", "last_sign_in_ip", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)):
app/models/user.rb:33:in `ensure_authentication_token!'
app/controllers/api/registrations_controller.rb:7:in `create'
Как я могу получить свой код для возврата 422 с описанием ошибки?
Заранее большое спасибо за вашу мудрость!