Ruby on rails 基于rails中下拉框id的验证

Ruby on rails 基于rails中下拉框id的验证,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,我在输入过程中进行了如下验证: validates :solids, :numericality => { :greater_than_or_equal_to => 0 }, :if => lambda { if self.lab_method_id lab_method = LabMethod.find(self.lab_method_id) lab_method.solids? end } 我希望根据下拉框的选定id更改此条件 我在我的模型中尝试

我在输入过程中进行了如下验证:

validates :solids, :numericality => { :greater_than_or_equal_to => 0 }, :if => lambda { 
  if self.lab_method_id
    lab_method = LabMethod.find(self.lab_method_id)
    lab_method.solids?
  end
}
我希望根据下拉框的选定id更改此条件

我在我的模型中尝试了这一点:

if self.lab_method_id == 1
validates :solids, :numericality => { :greater_than_or_equal_to => 0 }, :if => lambda { 
  if self.lab_method_id
    lab_method = LabMethod.find(self.lab_method_id)
    lab_method.solids?
  end
}
elsif
validates :solids, :numericality => { :greater_than_or_equal_to => 5 }, :if => lambda { 
  if self.lab_method_id
    lab_method = LabMethod.find(self.lab_method_id)
    lab_method.solids?
  end
}
end
但是,这在页面加载时返回了错误:

nil:NilClass的未定义方法“key”

我认为这与模型中的验证在页面加载时加载这一事实有关,而此时检查id的if语句将不起作用。虽然这个错误对我来说没有什么意义

因此,我想知道如何根据所选下拉框项目的id选择特定验证(我是否正确获得id)

奖金:有人能解释一下与这个特定错误的关系吗

编辑-堆栈跟踪:

供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u controller/metal/hide\u actions.rb:36:in
visible\u action?“
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u controller/metal/hide\u actions.rb:18:in
method\u for\u action' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u controller/metal/implicit\u render.rb:14:in
method\u for\u action'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u controller/metal/compatibility.rb:61:in
method\u for\u action' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/abstract_controller/base.rb:115:in
process'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/abstract\u controller/rendering.rb:45:in
process' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u controller/metal.rb:203:in
dispatch'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u controller/metal/rack\u delegation.rb:14:in
dispatch' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_controller/metal.rb:246:in
block in action'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/routing/route_set.rb:66:in
call' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/routing/route_set.rb:66:in
dispatch'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/routing/route_set.rb:30:in
call' vendor/bundle/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:68:in
block-in-call'
vendor/bundle/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:56:in
每个' vendor/bundle/ruby/1.9.1/gems/thinge-1.0.4/lib/thinge/router.rb:56:in
call'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/routing/route_set.rb:589:in
call' vendor/bundle/ruby/1.9.1/gems/warden-1.2.1/lib/warden/manager.rb:35:in
block-in-call'
vendor/bundle/ruby/1.9.1/gems/warden-1.2.1/lib/warden/manager.rb:34:in
catch' vendor/bundle/ruby/1.9.1/gems/warden-1.2.1/lib/warden/manager.rb:34:in
call'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/best\u standards\u support.rb:17:in
call' vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/etag.rb:23:in
call'
供应商/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/conditionalget.rb:25:in
call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/head.rb:14:in
call'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/params_parser.rb:21:in
call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/flash.rb:242:in
call'
供应商/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:205:in
context' 供应商/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:200:in
call'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/cookies.rb:338:in
call' vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.1/lib/active\u record/query\u cache.rb:64:in
call'
供应商/bundle/ruby/1.9.1/gems/activerecord-3.2.1/lib/active\u record/connection\u adapters/abstract/connection\u pool.rb:443:in
call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/callbacks.rb:28:in
block in call'
供应商/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active\u-support/callbacks.rb:405:in
run\u 803795940\u callbacks\u 68852270\u vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active\u support/callbacks.rb:405:in
\uu运行\u回调'
供应商/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active\u support/callbacks.rb:385:in
\u run\u callbacks' vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active\u support/callbacks.rb:81:in
run\u callbacks'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/callbacks.rb:27:in
call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/reloader.rb:65:in
call'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/remote\u ip.rb:31:in
call' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/debug\u exceptions.rb:16:in
call'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/show\u exceptions.rb:56:in
call' vendor/bundle/ruby/1.9.1/gems/railties-3.2.1/lib/rails/rack/logger.rb:26:in
call_app'
vendor/bundle/ruby/1.9.1/gems/railties-3.2.1/lib/rails/rack/logger.rb:16:in
call' config/initializers/quiet_assets.rb:6:in
call_with_quiet_assets'
供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/request\u id.rb:22:in
call' vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/methodoverride.rb:21:in
call'
供应商/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/runtime.rb:17:in
call' vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active\u support/cache/strategy/local\u cache.rb:72:in
call'
供应商/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/lock.rb:15:in
call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action\u dispatch/middleware/static.rb:53:in
call'
vendor/bundle/ruby/1.9.1/gems/railties-3.2.1/lib/rails/engine.rb:47
validate :solids_validation

def solids_validation
  if self.lab_method_id
    lab_method = LabMethod.find(self.lab_method_id)
    if lab_method.solids?
      if (val = Kernel.Float(solids) rescue nil)
        min = (self.lab_method_id == 1 ? 0 : 5)
        errors.add(:solids, "must be greater than or equal to #{min}") if val < min
      else
        errors.add(:solids, :not_a_number)
      end
    end
  end
end