ruby-on-rails - 如何调用 ActiveRecord 验证器作为实例方法(ala Sequel)?

标签 ruby-on-rails ruby ruby-on-rails-3 activerecord sequel

我有一个模型需要不同的验证器,具体取决于其当前状态。我应该如何为每个实例调用 ActiveRecord 验证器?我想尽可能多地重复使用管道,但我不确定如何继续。

class Order < ActiveRecord::Base
  attr_accessible :state

  validate :state_specific_validations

  def state_specific_validations
    if :paid == self.state
      # Warning: here be Unicorns...

      # Wishful thinking...
      validate_presence_of :paid_at
      validate_associated :purchaser

      # Hopeful. What are the validators called internally in Rails?
      errors << PresenceValidator.new(self, :paid_at).valid?
      errors << AssociationValidator.new(self, :paid_at).valid?

      # Plan B
      # ... Hoping for help from the audience ...

    else
      # Even more complicated validator logic, hoping for some DRY validators
    end
  end
end

我可以只使用自定义验证器,但为什么我需要复制所有内置验证器逻辑(i18n 错误消息等)?

有没有一种巧妙的方法可以将 Rails 验证器作为实例方法调用? 我认为 Sequel 的基于实例的验证器的做法比 ActiveRecord 的基于类的验证器更合理,但我不是来评判的。我只想回去解决更有趣的问题。我只是希望其他人已经遇到了这个问题,并且可以指出一些有趣的要点或精华。

最佳答案

我很确定所有的 validate_* 方法都可以采用 :if 选项——它可以指向另一个方法(也可能接受 Proc) ,因此您可以将验证分解为更像是:

validates_presence_of :paid_at, :if => :paid?
validates_association :purchaser, :if => :paid?

为了进一步清理,有 with_options 助手:

with_options :if => :paid? do |v|
  v.validates_presence_of :paid_at
  v.validates_association :purchaser
end

虽然不确定两者是否可以与标准 validate :custom_validate_method 一起使用 - 但我不会感到惊讶。

关于ruby-on-rails - 如何调用 ActiveRecord 验证器作为实例方法(ala Sequel)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7063155/

相关文章:

ruby - ruby 中的控制台表格式

ruby - 如何使用 Ruby-Rails 删除文件夹的所有内容?

rake db :create 后 MySql 错误 1045

ruby-on-rails - 我可以加密我的应用程序和数据库之间传输的数据吗

ruby-on-rails - ActiveJob 自定义序列化程序 - 未初始化的常量 NameError

ruby-on-rails - Ruby 将行添加到代码块 (Proc)

ruby - Ruby 中的动态调度 : strings vs symbols

ruby-on-rails - 在Rails(ActiveRecord)中找到第一条记录的最快方法是什么?

ruby-on-rails-3 - 尝试将拇指射手安装为 gem 后,不是 Gem::Specification 错误

ruby-on-rails-3 - 在 Rails 3 中保存到模型时如何将美国日期格式设置为默认格式