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:invisible\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:inmethod\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:inprocess'
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:indispatch'
供应商/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:inblock 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:indispatch'
供应商/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:inblock-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:incall'
供应商/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:inblock-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:incall'
供应商/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:incall'
供应商/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:incall'
供应商/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:incall'
供应商/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:incall'
供应商/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:incall'
供应商/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:inblock 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:inrun\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:incall'
供应商/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:incall'
供应商/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:incall_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:incall_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:incall'
供应商/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:incall'
供应商/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:incall'
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