我正在使用的rails应用程序中有以下非常难看的ruby代码:
if params.present?
if params[:search].present?
if params[:search][:tags_name_in].present?
...
end
end
end
所有我想问的是是否已经定义了params [:search] [:tags_name_in],但因为params,params [:search]和params [:search] [:tags_name_in]可能都是nil ,如果我使用......
if params[:search][:tags_name_in].present?
...如果没有参数或没有搜索参数,我会收到错误。
当然必须有更好的方法来做到这一点......建议??
答案 0 :(得分:11)
如果你只是想看看它的定义为什么不保持简单并使用定义的?功能
if defined?(params[:search][:tags_name_in])
答案 1 :(得分:6)
将始终定义参数,因此您可以删除它。
减少您可以执行的代码量
if params[:search] && params[:search][:tags_name_in]
#code
end
如果未定义params[:search]
,则条件将短路并返回nil
。
答案 2 :(得分:4)
您可以使用andand。它处理这种情况:
if params[:search].andand[:tags_name_in].andand.present?
答案 3 :(得分:4)
如果params[:search][:tags_name_in]
为nil
,您有很多选择会返回params[:search]
或nil
的值。
清晰但冗长:
params[:search] && params[:search][:tags_name_in]
使用try
(来自active_support
):
params[:search].try(:[], :tags_name_in)
使用救援:
params[:search][:tags_name_in] rescue nil
使用fetch
:
params.fetch(:search, {})[:tags_name_in]
请注意,fetch
有时可以用来完全避免if
,特别是如果在未指定param时无事可做:
def deal_with_tags
MyModel.where :tags => params.fetch(:search){ return }[:tags_name_in]
end
答案 4 :(得分:3)
哈哈,如果你想变得糟糕而且monkeypatch nil:
class NilClass
def [](key)
nil
end
end
如果其他答案建议,我会建议短路。
答案 5 :(得分:0)
我通常最终会做这样的事情:
if params.has_key?(:search) && params[:search].has_key?(:tags_name_in)
...
end
虽然如果你不介意在你的if语句中对nils进行测试,你也可以这样做:
if params[:search] && params[:search][:tags_name_in] ...
这不会引发错误,因为ruby short-circuits&&操作