我正在尝试使用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”=&gt;“52c6e4be5eeba78e5954a2997d9cac73”,“_ csff_token”=&gt;“kf1CYslb / rVmTWjoD4Qn4l1vZCeCwQOgg3VEYLqNTTg =”,“warden.user.user.key”=&gt; [“用户”,[11],“$ 2 a $ 10 $ EHEjfT / B1jsjNIoR5.oJ2。“],”flash“=&gt;#,@ closed = false,@ splash = {:workorder_id =&gt; 2,:employee_id =&gt; 5,:comment =&gt; true} ,@ now = nil&gt;}
并且workorder / 2有wostatus / 235而且wostatus有statuscode = WAPPR
action_name是“new”
错误来自于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
UPDATE2
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
我是否使用正确的编码类型来执行此业务规则?还有更好的方法吗?
答案 0 :(得分:1)
替换:
validates_with WOStatusValidator
使用:
validates_with ::WOStatusValidator
它明确告诉Rails寻找顶级常量。