2013-10-28 10 views
18

in den Schienen docs, the example provided für die object.presence Methode ist:Was ist der Sinn von object.presence?

region = params[:state].presence || params[:country].presence || 'US' 

Aber ist das nicht nur äquivalent zu:

region = params[:state] || params[:country] || 'US' 

Was ist der Punkt presence der Verwendung?

Antwort

45

Hier ist der Punkt:

''.presence 
# => nil 

so, wenn params[:state] == '':

region = params[:state].presence || 'US' 
# => 'US' 
region = params[:state] || 'US' 
# => '' 

Was mehr ist, ist es in ähnlicher Weise arbeitet (das heißt, kehrt nil, wenn das Objekt 'leer' ist) auf jedem Objekt das reagiert auf empty? Methode, zum Beispiel:

[].presence 
# => nil 

Hier ist die Dokumentation als Referenz:

http://api.rubyonrails.org/classes/Object.html#method-i-presence

+0

nicht, wenn sie auf 'leer reagieren? ' – apneadiving

+0

@apneadiving nein, nachdem Sie 'Active' benötigen, antwortet jeder' Object' Instanz 'leer?'. Referenz: http://api.rubyonrails.org/classes/Object.html –

+0

@apneadiving Blick auf die 'leere?' Quelle. Es gibt ein anderes Verhalten, das davon abhängt, ob das Objekt auf "leer?" Reagiert. –

1

ich es nur in nützlicher Weise verwende ich ordentlich gefunden. Meine Variable ist eine Zeichenkette, wenn es die leere Zeichenkette ist, die ich nil will, andernfalls möchte ich sie in eine ganze Zahl umwandeln.

x.presence.try(&:to_i) 

"".presence.try(&:to_i) # => nil 
"22".presence.try(&:to_i) # => 22 
+1

warum 'nil.to_i # => nil'? es sollte Null sein –

+0

@NickolayKondratenko, weil Sie manchmal zwischen einem leeren Wert und der Zeichenfolge '" 0 "' unterscheiden möchten. – Kelvin