Rails:如何在保存之前验证对象字段的值?

时间:2015-01-20 11:57:18

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

我正在编写一个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()将值已经写入返回给数据库,而不是将要写入的那个,因此验证不会不行。如何检查从Web表单传递的值?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

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

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

然后在模型中:

validates :file, file: true

答案 1 :(得分:2)

关于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 scaffolding实际上会突出显示不正确的字段并给出它们并错误消息说明错误。您也可以编写自己的验证,例如

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