Ruby:Nils在IF语句中

And*_*rew 9 ruby hash null if-statement ruby-on-rails

我正在使用的rails应用程序中有以下非常难看的ruby代码:

if params.present?
  if params[:search].present?
    if params[:search][:tags_name_in].present?
      ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

所有我想问的是是否已经定义了params [:search] [:tags_name_in],但因为params,params [:search]和params [:search] [:tags_name_in]可能都是零,如果我使用...

if params[:search][:tags_name_in].present?
Run Code Online (Sandbox Code Playgroud)

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

肯定有一个更好的方法来做到这一点......建议?

Wil*_*Ayd 11

如果你只是想看看它的定义为什么不保持简单并使用定义的?功能?

if defined?(params[:search][:tags_name_in])
Run Code Online (Sandbox Code Playgroud)

  • 这与他最初提出的有关的代码不同.如果变量已经初始化,那么`defined?`将返回true,即使它被设置为`nil`.`present?`使用`blank?`检查,所以`nil`将返回false. (2认同)

Mik*_*wis 6

Params将始终定义,因此您可以删除它.

减少您可以执行的代码量

if params[:search] && params[:search][:tags_name_in]
  #code
end
Run Code Online (Sandbox Code Playgroud)

如果params[:search]没有定义,条件将短路并返回nil.