在轨道中测试参数的最佳方法是什么?

时间:2013-07-26 14:51:46

标签: ruby-on-rails ruby

好吧,我有一个像这样的参数:

params = { :q => { :id_eq => "" } }

测试id_eq是否为空的最佳方法是什么? 我目前正在使用if params[:q] && params[:q][:id_eq].blank?但似乎有很多重复的代码。

有更好的方法吗?

3 个答案:

答案 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 

出于有条件的目的,nilfalse之间的区别无关紧要,但获取true代替nil肯定是错误的。

答案 2 :(得分:-1)

rescue始终是一个选项:

if (params[:q][:id_eq].blank? rescue false)