1

我正在尝试使用 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

我是否使用正确的编码类型来执行此业务规则?有没有更好的办法?

4

1 回答 1

1

代替:

validates_with WOStatusValidator

和:

validates_with ::WOStatusValidator

它明确告诉 Rails 寻找顶级常量。

于 2013-04-05T15:11:41.757 回答