【问题标题】:Rails: how to validate an object field's value before save?Rails:如何在保存之前验证对象字段的值?
【发布时间】:2015-01-20 11:57:17
【问题描述】:

我正在编写一个 Redmine 插件,该插件应检查是否根据其他字段中的值填充问题的某些字段。
我编写了一个实现validate 回调的插件,但我不知道如何检查将要保存的字段值。 这是我目前所拥有的:

module IssuePatch

def self.included(receiver)

  receiver.class_eval do
    unloadable

    validate :require_comment_when_risk

    protected
    def require_comment_when_risk
      risk_reduction = self.custom_value_for(3)
      if risk_reduction.nil? || risk_reduction.value == 0
        return true
      end

      comment2 = self.custom_value_for(4)
      if comment2.nil? || comment2.value.empty?
        errors.add(:comment2, "Comment2 is empty")
      end
    end
  end
end
end

这里的问题是 self.custom_value_for() 返回值 已经写入 到数据库,但不是 将要写入的值,因此验证不会工作。如何检查从网络表单传递的值?

任何帮助将不胜感激。

【问题讨论】:

  • custom_value_for是哪个方法?
  • @Rodrigo,这是一个问题模型方法
  • 对不起,我不知道Redmine!但本指南可以帮助您:guides.rubyonrails.org/…

标签: ruby-on-rails ruby redmine ruby-on-rails-plugins


【解决方案1】:

rails 的好处是在你的控制器中你不需要验证任何东西。你应该在你的模型中完成所有这些。所以在你的模型中你应该做类似

validates :value_that_you_care_about, :numericality => { :greater_than_or_equal_to => 0 }

validates :buyer_name, presence: true, :length => {:minimum => 4}

validates :delivery_location, presence: true

如果其中任何一个失败,这将停止保存对象,如果您使用的是 rails 脚手架,实际上会突出显示不正确的字段并给出错误消息来解释错误。您还可以编写自己的验证,例如

def enough_red_flowers inventory
    if inventory.total_red_flowers-self.red_flower_quantity < 0
      self.errors.add(:base, 'There are not enough Red Flowers Currently')
      return false
    end
    inventory.total_red_flowers = inventory.total_red_flowers-self.red_flower_quantity
    inventory.save
    true
  end

要编写自己的自定义消息,只需按照 self.errors.add(:base, 'your message') 的示例进行操作

您可以找到更多验证here

【讨论】:

    【解决方案2】:

    创建自定义验证器的更好方法

    class FileValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        # some logic for validation
      end
    end
    

    然后在模型中:

    validates :file, file: true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2016-06-29
      • 2017-09-14
      • 2023-03-16
      相关资源
      最近更新 更多