我正在尝试使用 validates_with 编写我的第一个业务规则。如果工作订单的状态为“WAPPR”(等待批准),我不希望输入事件(人工)。
这是在我的事件模型中:
class Event < ActiveRecord::Base
validates_presence_of :workorder_id
validates_with ::WOStatusValidator
...
end
class WOStatusValidator < ActiveModel::Validator
def validate(record)
if record.workorder.wostatus.statuscode == "WAPPR"
record.errors[:base] << "Can't enter labor if workorder status is WAPPR"
end
end
end
但是,我明白了:
undefined method `key?' for nil:NilClass
谢谢您的帮助!!
更新
机架会话有这个:
{"session_id"=>"52c6e4be5eeba78e5954a2997d9cac73", "_csrf_token"=>"kf1CYslb/rVmTWjoD4Qn4l1vZCeCwQOgg3VEYLqNTTg=", "warden.user.user.key"=>["用户", [11], "$2ajsjNIo51$EHEjfT/B .oJ2."], "flash"=>#, @close=false, @flashes={:workorder_id=>2, :employee_id=>5, :comment=>true}, @now=nil>}
并且 workorder/2 有 wostatus/235 并且 wostatus 有 statuscode = WAPR
action_name 是“新的”
错误来自 visible_action?(gem) actionpack-3.2.12/lib/action_controller/metal/hide_actions.rb 中的代码
第 36 行
35 def visible_action?(action_name)
36 return @visible_actions[action_name] if @visible_actions.key?(action_name)
37 @visible_actions[action_name] = !hidden_actions.include?(action_name)
38 end
更新2
jvnill 建议:
record.errors.add :base, "Can't enter labor if workorder status is WAPPR"
我做了那个改变,现在我得到了
“未初始化的常量 WOStatusValidator”
它来自此代码的第 11 行:
8 class RoutingError < ActionControllerError #:nodoc:
9 attr_reader :failures
10 def initialize(message, failures=[])
11 super(message)
12 @failures = failures 13 end 14 end
UDPATE3
我是否使用正确的编码类型来执行此业务规则?有没有更好的办法?