2011-10-26 121 views
2

我on Rails的3.0.x中,红宝石1.9.2,需要一种方式来测试,可能会或可能不会存在参数,可以如红宝石1.9.2不存在散元素

params[:user] #exists 
params[:user][:login] #may not exist 

什么第二次检查的正确的Ruby语法,所以它不会barf?

+1

duplicated:http://stackoverflow.com/questions/4371716/looking-for-a-good-way-to-avoid-hash-conditionals-in-ruby – tokland

回答

2

尝试以下操作:

params.has_key? :user #=> true because exists 
params[:user].has_key? :login #=> true if exist otherwise false 
+0

不错的建议,但不'因为'params [:user]'首先工作将其作为字符串返回,在这种情况下,它不再是散列,因此也没有'has_key?'方法。 –

1

@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。主要是一个偏好问题。

0

你只会在第二种情况下得到零 ..这不应该是一个问题,不是? 例如params[:user][:login]只返回nil,如果:user条目存在于第一个哈希中,则返回nil,其值为false。

但是,如果嵌套会更深一层或多层,而缺少的散列条目位于中间某处,则会出现问题。例如:

params[:user][:missing_key][:something] 
在这种情况下

红宝石会尝试评估为零[:东西]和引发异常

你可以做这样的事情:

begin 
    x = params[:user][:missing_key][:something] 
rescue 
    x = nil 
end 

...你能进一步抽象...