【问题标题】:Validation based on id of drop down box in rails基于rails中下拉框的id进行验证
【发布时间】:2013-01-12 03:48:03
【问题描述】:

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

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

但是这会在页面加载时返回错误:

未定义的方法`key?'对于 nil:NilClass

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

所以我想知道如何设置它以根据所选下拉框项目的 id 选择特定验证(我什至可以正确获取 id)?

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

编辑 - 堆栈跟踪:

vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_controller/metal/hide_actions.rb:36:in visible_action?' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_controller/metal/hide_actions.rb:18:inmethod_for_action' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_controller/metal/implicit_render.rb:14:in method_for_action' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_controller/metal/compatibility.rb:61:inmethod_for_action' 供应商/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_controller/rendering.rb:45:inprocess' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_controller/metal.rb:203:in dispatch' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_controller/metal/rack_delegation.rb:14:indispatch' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_controller/metal.rb:246:in block in action' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/routing/route_set.rb:66:incall' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/routing/route_set.rb:66:in dispatch' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/routing/route_set.rb:30:incall' 供应商/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:ineach' 供应商/bundle/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:56:in call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/routing/route_set.rb:589:incall' 供应商/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:incatch' 供应商/bundle/ruby/1.9.1/gems/warden-1.2.1/lib/warden/manager.rb:34:in call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/best_standards_support.rb:17:incall' 供应商/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/etag.rb:23:in call' vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/conditionalget.rb:25:incall' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/head.rb:14:in call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/params_parser.rb:21:incall' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/flash.rb:242:in call' vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:205:incontext' 供应商/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:200:in call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/cookies.rb:338:incall' 供应商/bundle/ruby/1.9.1/gems/activerecord-3.2.1/lib/active_record/query_cache.rb:64:in call' vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:443:incall' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/callbacks.rb:28:in block in call' vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active_support/callbacks.rb:405:inrun_803795940_call_68852270__回调' 供应商/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active_support/callbacks.rb:405:in __run_callback' vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active_support/callbacks.rb:385:in_run_call_callbacks' 供应商/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active_support/callbacks.rb:81:in run_callbacks' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/callbacks.rb:27:incall' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/reloader.rb:65:in call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/remote_ip.rb:31:incall' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/debug_exceptions.rb:16:in call' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/show_exceptions.rb:56:incall' 供应商/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:incall' config/initializers/quiet_assets.rb:6:in call_with_quiet_assets' vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/request_id.rb:22:incall' 供应商/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/methodoverride.rb:21:in call' vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/runtime.rb:17:incall' 供应商/bundle/ruby/1.9.1/gems/activesupport-3.2.1/lib/active_support/cache/strategy/local_cache.rb:72:in call' vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/lock.rb:15:incall' 供应商/bundle/ruby/1.9.1/gems/actionpack-3.2.1/lib/action_dispatch/middleware/static.rb:53:in call' vendor/bundle/ruby/1.9.1/gems/railties-3.2.1/lib/rails/engine.rb:479:incall' 供应商/bundle/ruby/1.9.1/gems/railties-3.2.1/lib/rails/application.rb:220:in call' vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/content_length.rb:14:incall' 供应商/bundle/ruby/1.9.1/gems/railties-3.2.1/lib/rails/rack/log_tailer.rb:14:in call' vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/handler/webrick.rb:59:inservice' /usr/lib/ruby/1.9.1/webrick/httpserver.rb:138:in service' /usr/lib/ruby/1.9.1/webrick/httpserver.rb:94:inrun' /usr/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

【问题讨论】:

  • 你能发布你的堆栈跟踪吗?

标签: ruby-on-rails ruby rails-activerecord


【解决方案1】:

NumericalityValidator(此帮助程序的底层验证器)无法在您想要的动态条件下工作。使用自定义验证器:

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

【讨论】:

  • 感谢您的输入......到达那里......即使输入了值,这也会返回“固体不是数字”。此外,这是否仅验证 lab_method_id 是否 == 为 1 而不是 2?
  • @jshbrmn:抱歉,我错过了复数形式(solids vs solid)——已修复,你现在可以试试吗? lab_method_id == 1 的比较只是为了得到solids 必须达到或超过的最小值。该值在下一行进行测试。
  • 太棒了,最终用它作为获得我想要的东西的手段,稍微改变了它,但最终给了我答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多