我正在使用postgres和design开发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-zwb -_'!&@#.]+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表的唯一索引。我的用户注册视图是从设计中创建的。例如,我创建了一个测试帐户,用户名为"test",电子邮件为"test@example.com",密码为"123456"。我退出并尝试用相同的信息注册。我期望:唯一性验证触发并呈现在注册表单旁边的错误列表上,但我得到了一个完整的页面错误:
错误:重复键值违反唯一约束"index_users_on_email"DETAIL: Key (email)=(test@example.com)已经存在。
我怎么能让这个错误冒泡到Rails,并显示为友好的单行错误,如"电子邮件已经注册了一个帐户"旁边的注册表单,而不是被捕获与一个大的Rails错误页面?
我已经发现了问题。插件friendly_id结果不那么友好。它破坏唯一性验证并导致500个内部服务器错误。我已经把它从我的申请中删除了。考虑在Stringex库中使用ActsAsUrl之类的东西。我已经删除了
extend FriendlyId
friendly_id :username_copy, :use => :slugged
,我现在使用
acts_as_url :username, :sync_url => true, :url_attribute => :slug
生成友好的url。