Is there a nicer oneliner to handle "if somthing.nil? || something [: key] .nil?"

Is there any way to make this liner better?

@var = params[:key1][:key2] unless params.blank? || params[:key1].blank?
+3
source share
7 answers

Wow, thanks for all the answers!

I am going to summarize the answers - as the answer seems more subtle than just another oneliner; -)

As gertas points out, parameters are always present in the controller action (which really works), and that the nil check is sufficient, my source code can be reduced to:

@var = params[:key1][:key2] unless params[:key1].nil?

It's readable, but not as short as other sentences, for example

params[:key1].nil? || (@var = params[:key1][:key2])

@var =  params[:key1] && params[:key1][:key2]

or even

@var = (params[:key1] || {})[:key2]

, rubys try() , hellvinz ( / ):

@var = params[:key1].try(:fetch, :key2, nil)

, , :

@var = params.fetch(:key1, {}).fetch(:key2, nil)

@var = {:key1=>{}}.merge(params)[:key1][:key2]

" ", " ",

!: -)

+1

, .

@var =  params && params[:key1] && params[:key1][:key2]
+1

:

params.blank? || params[:key1].blank? || (@var = params[:key1][:key2])

.

+1

, , , , :) ( ):

@var = params.try(:fetch, :key1, nil).try(:fetch, :key2, nil)
+1

Brevity!

, , , , , .

Personally, I would go with your original.

0
source

I assume that you are using it in the controller (params allways present - not nil):

@var = (params[:key1] || {})[:key2]

0
source

This is a simple idea.

@var = params.fetch(:key1, {}).fetch(:key2, nil)

Use is mergeinteresting.

@var = {:key1=>{}}.merge(params)[:key1][:key2]
0
source

Source: https://habr.com/ru/post/1765061/


All Articles