Ruby 检查参数[:x][:y]是否存在的最短方法

Ruby 检查参数[:x][:y]是否存在的最短方法,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我试图检查params[:search][:city]是否存在,但我得到的是: do_magic if params[:search].try(:city) # undefined method `city' for {"city"=>["3"]}:ActiveSupport::HashWithIndifferentAccess 如果密钥存在,则会显示此错误,但当密钥不存在时,它会意外地工作 请记住,:search和:city可能根本不存在于params散列中 有什么想法吗?try正在尝

我试图检查
params[:search][:city]
是否存在,但我得到的是:

do_magic if params[:search].try(:city) # undefined method `city' for {"city"=>["3"]}:ActiveSupport::HashWithIndifferentAccess
如果密钥存在,则会显示此错误,但当密钥不存在时,它会意外地工作

请记住,
:search
:city
可能根本不存在于params散列中


有什么想法吗?

try
正在尝试使用给定名称调用方法。您需要一个带有参数的
[]
方法

do_magic if params[:search].try(:[], :city)

<强>塞尔吉奥的<强>解决方案不考虑情况,当<代码>:PARAM[[搜索] 是<代码>字符串< /代码>。如果是这样,ruby会产生一个错误:

can't convert Symbol into Integer
因此,涵盖所有情况的正确解决方案是检查
params[:search]
是否为
Hash
,然后检查
:city

do_magic if params[:search].is_a?(Hash) && params[:search][:city]

谢谢,这就解决了它,只是为了确保,我的做法是否正确?是的,我会用同样的方法,我认为可以安全地假设
params[:search]
来自html表单。要么是散列,要么是零。我无法想象一个表单能产生一个散列或字符串。Jeff的问题是不完整的——没有上下文。我在行动中遇到了这个问题。当请求与此类似时,
url.html?search=123
params[:search]
将返回一个
字符串。当然,当
params[:search]
nil
Hash