Ruby:Nils在IF语句中

时间:2011-03-22 15:53:14

标签: ruby-on-rails ruby hash if-statement null

我正在使用的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?

...如果没有参数或没有搜索参数,我会收到错误。

当然必须有更好的方法来做到这一点......建议??

6 个答案:

答案 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&&操作