假设一个模型捕获到验证错误,通常这是由控制器处理的,但模型是否可以自动处理它?</ p>
实际上,我想为每个uid
生成一个唯一的ID Note
,模型如下所示:
class Note < ActiveRecord::Base
validates_uniqueness_of :uid
# ... some code to generate uid on after_initialize
end
我最接近的是:
class Note < ActiveRecord::Base
validates_uniqueness_of :uid
# ... some code to generate uid on after_initialize
after_rollback :repair
protected
def repair
if self.errors[:uid].size > 0
self.uid = generate_uid
end
self.save # Try again
end
end
我的解决方案的一些直接问题:(1)模型实例仍然存在控制器可以看到的错误,我不确定如何清除错误。 (2)修复方法是递归的。
答案 0 :(得分:2)
虽然我确信有一种方法可以捕获并处理模型中的错误(也许after_validation
回调可能有用),但也许你可以通过确保{在这种情况下避免这个问题{1}}您创建时生成的内容是唯一的。
Ryan Bates offered this method for generating unique tokens in a RailsCast:
uid
使用def generate_token(column)
begin
self[column] = SecureRandom.urlsafe_base64
end while User.exists?(column => self[column])
end
回调即before_create
,每个模型都会有唯一的ID。
所有这些都说,@ Beerlington提出了一个关于UUID的非常好的观点。
更新:请注意,指定的方法需要在before_create { generate_token(:uid) }
模型中定义。对于您的示例,您需要将其更改为User
。
答案 1 :(得分:0)
我会使用保证唯一的真正UUID,而不是为模型添加开销。在模型中进行唯一性验证会增加一些开销,因为它必须访问数据库以确定是否存在某些内容,而且它仍然无法保证。
查看此Ruby项目以生成UUID:https://github.com/assaf/uuid/