3

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

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

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

有没有更好的办法?

4

3 回答 3

4

没有比你已经在做的更好的方法了。(至少在我看来。)依赖异常是一个坏主意,其他任何东西都明显不那么清晰。

于 2013-07-26T15:49:18.297 回答
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肯定是错误的。

于 2013-07-26T14:52:50.277 回答
-1

rescue始终是一种选择:

if (params[:q][:id_eq].blank? rescue false)
于 2013-07-26T15:11:45.170 回答