Postgresとdeviseを使用してRails 4で開発しています。私は次のユーザーモデルを持っています:
# user model
class User < ActiveRecord::Base
extend FriendlyId
friendly_id :username, :use => :slugged
rolify
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable
validates :username, :presence => true, :uniqueness => {:case_sensitive => false}, :length => { :minimum => 3 },
:format => { :with => /\A[A-Z0-9a-z\w\b\ \-\_\'\!&@#\.]+\z/i,
:message => "may contain only alphanumeric characters and common special characters." }
validates :email, :uniqueness => {:case_sensitive => false}, :presence => true,
:format => { :with => Devise.email_regexp, :message => "isn't valid"}
validates :password, length: { in: 6..128 }, on: :create
validates :password, length: { in: 6..128 }, on: :update, allow_blank: true
validates :slug, :presence => true
end
# in schema
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.string "username"
t.string "slug"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
add_index "users", ["slug"], name: "index_users_on_slug", unique: true
add_index "users", ["username"], name: "index_users_on_username", unique: true
フィールド email と username は users テーブルの一意のインデックスです。私のユーザー登録ビューはdeviseから作成されました。たとえば、ユーザー名「test」、電子メール「test@example.com」、パスワード「123456」でテスト アカウントを作成します。サインアウトして、同じ情報でサインアップしようとしました。:uniqueness 検証がトリガーされ、サインアップ フォームと一緒にエラーのリストに表示されることを期待していますが、代わりに次のようなフルページ エラーが発生します。
エラー: 重複するキー値が一意の制約 "index_users_on_email" に違反しています 詳細: キー (email)=(test@example.com) は既に存在します。
このエラーが Rails にバブルアップし、Rails の大きなエラー ページが表示されるのではなく、サインアップ フォームの横に「メールは既にアカウントに登録されています」のようなわかりやすい 1 行のエラーとして表示されるようにするにはどうすればよいですか?