【问题标题】:How to validate a single attribute for a submitting ActiveRecord instead of all its attributes?如何验证提交 ActiveRecord 的单个属性而不是其所有属性?
【发布时间】:2011-03-20 08:39:55
【问题描述】:

我正在使用 Ruby on Rails 3,我想验证提交 ActiveRecord 的单个属性而不是其所有属性。

例如,在我的模型中,我有:

validates :firstname, :presence => true, ...
validates :lastname,  :presence => true, ...

我想分别在 :firstname:lastname 上运行验证有可能吗?如果是这样,我该怎么做?


P.S.:我知道出于验证目的,有“validates_presence_of”、“validates_confirmation_of”等方法,但我只想使用上面的代码。

【问题讨论】:

  • separately 是什么意思?例如,会有 2 个调用来保存,还是只有一个?您总体上要尝试做的事情的用例/场景是什么?

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


【解决方案1】:

您可以在模型上设置一个虚拟属性,然后根据该属性进行条件验证。

您可以在http://railscasts.com/episodes/41-conditional-validations 找到有关此的截屏视频

【讨论】:

    【解决方案2】:
    class Model < ActiveRecord::Base  
      def save(*attrs)
        Model.validates :firstname, :presence => true if attrs.empty? || attrs.include?( :firstname )
        Model.validates :lastname,  :presence => true if attrs.empty? || attrs.include?( :lastname )
        ...
        super
      end
    end
    
    m = Model.new
    m.save
    #=> false
    m.save(nil) # same as save(false), you can use both of them
    #=> true
    m = Model.new :firstname => "Putty"
    m.save
    #=> false
    m.save(:firstname, :lastname)
    #=> false
    m.save(:firstname)
    #=> true
    

    【讨论】:

    • 不错。但这不会覆盖ActiveRecord::Validations 中的save(options={}) 方法,从而使save(false) 不再起作用吗?对此不确定,但也许您已经考虑到这一点?
    • @Zabba,说得好,但实际上save(false) 将忽略所有验证,因为attrs 不会为空并且没有任何名称为false 的列名称。但是,是的——它很hacky,我们可以简单地重构这个方法:)
    【解决方案3】:

    您可以删除上面代码的第二行,使其显示为:

    validates :firstname, :presence => true
    

    不会对 :lastname 执行验证。

    问候

    罗宾

    【讨论】:

    • 我想分别验证 ':firstname' 和(然后)验证 ':lastname',所以我需要第二部分。
    猜你喜欢
    • 2011-06-15
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多