我正在编写一个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表单传递的值?
非常感谢任何帮助。
答案 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