我的数据库中有一个“用户”表和一个“电子邮件”列。我还在电子邮件列上创建了一个UNIQUE索引,以防止两个用户注册相同的电子邮件地址(注意:请不要建议我使用validates_uniqueness_of
,因为这是我试图避免的)。
当我运行RSpec测试以确保不能插入重复的记录时,我看到以下错误:
Failures:
1) User should not allow duplicate email addresses
Failure/Error: user2.save.should_not be_true
ActiveRecord::RecordNotUnique:
SQLite3::ConstraintException: column email is not unique: INSERT INTO "users" ("email", ... ) VALUES ( ... )
# ./spec/models/user_spec.rb:26
这很好,因为这意味着我的UNIQUE索引确实有效。问题是,我该如何处理此异常?我希望能够捕捉到它,然后向模型的错误集合添加一条合理的消息。
我尝试在控制器中使用rescue_from,但没有成功,如下所示:
rescue_from ActiveRecord::RecordNotUnique do |ex|
raise Email must be unique
end
Rails API文档似乎没有建议如何覆盖save()方法来添加开始/救援块,所以我的问题是:如何处理在save()过程中抛出的ActiveRecord::RecordNotUnique异常,然后将模型标记为无效,并向模型的错误集合添加合理的错误消息?