Ruby 1.9.2不存在的哈希元素

时间:2011-10-26 22:22:44

标签: ruby-on-rails ruby ruby-on-rails-3

我使用Rails 3.0.x,Ruby 1.9.2并且需要一种方法来测试可能存在或不存在的参数,例如,

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

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

3 个答案:

答案 0 :(得分:2)

请尝试以下操作:

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

答案 1 :(得分: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。主要是偏好问题。

答案 2 :(得分:0)

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

但是,如果嵌套的深度是一个或多个级别,并且缺少的哈希条目位于中间的某个位置,则会出现问题。 e.g:

params[:user][:missing_key][:something]

在这种情况下,Ruby会尝试评估nil [:something]并引发异常

你可以这样做:

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

......你可以进一步抽象......