【问题标题】:Why isn't my "validate" method determining if my Ruby model is valid?为什么我的“验证”方法不能确定我的 Ruby 模型是否有效?
【发布时间】:2017-04-26 20:33:42
【问题描述】:

我在 Rails 5.0 上。我对如何评估我是否有一个有效的模型感到困惑。我有一个使用这种方法的模型

class MyObjectTime < ActiveRecord::Base
    ...
  validate :valid_method

   def valid_method
     false
   end

请注意,我在有效方法中硬编码了“false”,但即使我创建了此类的对象并调用“obj.valid?”,即使我已经操纵了东西,我也会得到“true”因此模型永远不会有效。在确定模型是否有效时,我还需要做什么来考虑我的“valid_method”方法?

【问题讨论】:

  • 如果您转到api.rubyonrails.org/classes/ActiveModel/Validations/…,您会注意到您需要添加errors 收集一个错误,说明发生了什么。这就是应该使用validate 的方式。
  • 正如@fanta 指出的那样,除非你能以错误的形式给出原因,否则它被认为是一个有效的模型。
  • API 文档还提到:“注意验证方法的返回值是不相关的。”

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


【解决方案1】:
class MyObjectTime < ActiveRecord::Base
    ...
  validate :valid_method

   def valid_method
     errors.add(:foo, "is not valid") if some_condition?
   end

验证器方法的返回值无关紧要,重要的是它将错误添加到errors object(这是一个类似哈希的对象)。

基本上.valid? 运行验证,然后检查是否self.errors.any?

【讨论】:

    【解决方案2】:

    自定义验证通过检查自定义验证并在失败时添加错误来工作。

    这取自the guides

    class Invoice < ApplicationRecord
      validate :expiration_date_cannot_be_in_the_past,
        :discount_cannot_be_greater_than_total_value
    
      def expiration_date_cannot_be_in_the_past
        if expiration_date.present? && expiration_date < Date.today
          errors.add(:expiration_date, "can't be in the past")
        end
      end
    
      def discount_cannot_be_greater_than_total_value
        if discount > total_value
          errors.add(:discount, "can't be greater than total value")
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2019-06-16
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多