我on Rails的3.0.x中,红宝石1.9.2,需要一种方式来测试,可能会或可能不会存在参数,可以如红宝石1.9.2不存在散元素
params[:user] #exists
params[:user][:login] #may not exist
什么第二次检查的正确的Ruby语法,所以它不会barf?
我on Rails的3.0.x中,红宝石1.9.2,需要一种方式来测试,可能会或可能不会存在参数,可以如红宝石1.9.2不存在散元素
params[:user] #exists
params[:user][:login] #may not exist
什么第二次检查的正确的Ruby语法,所以它不会barf?
尝试以下操作:
params.has_key? :user #=> true because exists
params[:user].has_key? :login #=> true if exist otherwise false
不错的建议,但不'因为'params [:user]'首先工作将其作为字符串返回,在这种情况下,它不再是散列,因此也没有'has_key?'方法。 –
@WarHog有它的权利,漂亮多了。这是非常罕见的,在params
一个项目有时会返回一个字符串,但其他时间返回一个Hash,但不管你能处理的很轻松地:
if params.has_key?(:user) && params[:user].respond_to?(:has_key?)
do_something_with params[:user][:login]
end
相反respond_to? :has_key?
,你也可以做respond_to? :[]
或只是is_a? Hash
。主要是一个偏好问题。
你只会在第二种情况下得到零 ..这不应该是一个问题,不是? 例如params[:user][:login]
只返回nil,如果:user条目存在于第一个哈希中,则返回nil,其值为false。
但是,如果嵌套会更深一层或多层,而缺少的散列条目位于中间某处,则会出现问题。例如:
params[:user][:missing_key][:something]
在这种情况下
红宝石会尝试评估为零[:东西]和引发异常
你可以做这样的事情:
begin
x = params[:user][:missing_key][:something]
rescue
x = nil
end
...你能进一步抽象...
duplicated:http://stackoverflow.com/questions/4371716/looking-for-a-good-way-to-avoid-hash-conditionals-in-ruby – tokland