在Rails中,是否可以修复模型中的模型验证错误?

时间:2012-09-24 17:54:52

标签: ruby-on-rails ruby ruby-on-rails-3 validation model

假设一个模型捕获到验证错误,通常这是由控制器处理的,但模型是否可以自动处理它?<​​/ 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)修复方法是递归的。

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/