好吧,我有一个像这样的参数:
params = { :q => { :id_eq => "" } }
测试id_eq
是否为空的最佳方法是什么?
我目前正在使用if params[:q] && params[:q][:id_eq].blank?
但似乎有很多重复的代码。
有更好的方法吗?
答案 0 :(得分:4)
没有比你已经做过的更好的方法了。 (至少在我看来。)依赖异常是一个坏主意,其他任何东西都明显不那么清晰。
答案 1 :(得分:0)
if params.fetch(:q, {id_eq: true})[:id_eq].blank?
<小时/> OP的原始代码与其他答案之间的比较。到目前为止,我的答案是唯一能给出正确结果的答案。
params = { :q => { :id_eq => "" } }
params[:q] && params[:q][:id_eq].blank? # => true (OP)
params.fetch(:q, {id_eq: true})[:id_eq].blank? # => true (my code)
params[:q].try(:[], :id_eq).blank? # => true (Marek Lipka)
params.try(:values_at, :q).first[:id_eq].blank? # => true (mbratch old)
params[:q][:id_eq].blank? rescue false # => true (Doydle)
params.fetch(:q,{})[:id_eq].blank? # => true (Stefan)
params.try(:[], :q).try(:[], :id_eq).blank? # => true (mbratch new)
params = { :q => { :id_eq => "foo" } }
params[:q] && params[:q][:id_eq].blank? # => false
params.fetch(:q, {id_eq: true})[:id_eq].blank? # => false
params[:q].try(:[], :id_eq).blank? # => false
params.try(:values_at, :q).first[:id_eq].blank? # => false
params[:q][:id_eq].blank? rescue false # => false
params.fetch(:q,{})[:id_eq].blank? # => false
params.try(:[], :q).try(:[], :id_eq).blank? # => false
params = {}
params[:q] && params[:q][:id_eq].blank? # => nil (falesy value)
params.fetch(:q, {id_eq: true})[:id_eq].blank? # => false (falesy value)
params[:q].try(:[], :id_eq).blank? # => true # Wrong
params.try(:values_at, :q).first[:id_eq].blank? # => true # Wrong
params[:q][:id_eq].blank? rescue false # => true # Wrong
params.fetch(:q,{})[:id_eq].blank? # => true # Wrong
params.try(:[], :q).try(:[], :id_eq).blank? # => true # Wrong
出于有条件的目的,nil
和false
之间的区别无关紧要,但获取true
代替nil
肯定是错误的。
答案 2 :(得分:-1)
rescue
始终是一个选项:
if (params[:q][:id_eq].blank? rescue false)