2010-02-27 5 views
12

Ich möchte eine Textzeile nur anzeigen, wenn ein Objekt namens @foo gesetzt ist. Aus meiner Sicht versuche ich, etwas wie folgt aus:Wie überprüft man, ob ein Objekt in einer Ansicht in Ruby null ist?

<% if [email protected]_record? || [email protected]? %> 
    Foo is not a new record or nil 
<% end %> 

Aber dies nicht gelingt, Rückkehr You have a nil object when you didn't expect it! Ich bin ziemlich sicher, dies wegen der new_record? Verfahren geschieht. Wie überprüfe ich, ob etwas nicht ein neuer Datensatz oder Null ist, ohne einen Fehler zu verursachen? In PHP würde es durch die Frage if(!empty($foo)) erreicht werden, aber selbst die empty? Methode in Schienen verursacht den gleichen Fehler zurückgegeben werden.

Irgendwelche Ideen?

Antwort

13

Wie wäre:

<% if [email protected]? && [email protected]_record? %> 
    Hello! 
<% end %> 

Zunächst einmal müssen Sie lieber mit UND-Logik werden als ODER-Logik hier, da jede Active Objekt mindestens eine den Anforderungen der „nicht null“ nicht oder“erfüllt ein neuer Rekord ".

Zweitens stellt die Überprüfung auf Null zuerst sicher, dass die zweite Prüfung nicht ausgeführt wird, wenn die erste fehlschlägt. Der Fehler wird ausgelöst, weil Sie #new_record? nicht für ein Objekt verwenden können, das dies nicht unterstützt. Wenn Sie also zuerst nach Nil suchen, wird sichergestellt, dass diese Methode nie auf Null ausgeführt wird.

+0

höchst intuitiv! Danke! –

+1

Mit DeMorgans Gesetz könntest du es auch ein bisschen schön machen: 'es sei denn @ foo.nil? || @ foo.new_record ?; setzt 'Hallo!'; end; ' –

+4

'! foo.nil? 'lässt mein Gehirn bluten, weil es einfach durch' foo' ersetzt werden kann. Dies ist ein sehr einfaches und gebräuchliches Ruby-Idiom: 'if @foo &&! @ Foo.new_record?' –

1

Ich würde durch if @foo && @foo.id überprüfen. Dadurch wird überprüft, ob ein @foo-Objekt vorhanden ist, und sichergestellt, dass das Feld id nicht leer ist. Wenn das Feld id leer ist, bedeutet dies, dass es noch kein Datensatz in der Datenbank ist. Ich nehme an, Sie verwenden id Feld in der Tabelle.

+0

am prägnantesten! Danke! –

3

Sie könnten auch an diesen interessiert sein:

<%= @foo.text if @foo.present? %> 

oder

<%= @foo.text unless @foo.blank? %> 
+0

diese überprüfen nicht, ob @foo leer ist, aber danke für die zusätzlichen Methoden –

1

Der einfache Weg ist

<% if [email protected](:new_record) %> 
    Hello! 
<% end %> 
+0

sieht so aus als ob das nicht funktioniert –

1

Gibt es einen Grund, warum dieses Objekt gleich Null sein könnte, wenn es kommt auf die Aussicht? Manchmal kann das Hinzufügen einer bedingten Logik in der Ansicht ein Zeichen dafür sein, dass etwas umstrukturiert werden kann und Sie nur ein größeres Problem maskieren.

0

Ich verwende viel lieber die andand gem für diese Prüfungen.

if @foo.andand.id 
    "Hello!" 
end 

Der Aufruf von .id wird nur bei Nicht-Null-Objekten ausgeführt.

2

Lassen Sie mich eine andere Antwort nur zum Spaß werfen.

unless @foo.nil? or @foo.new_record? 
    "Hello" 
end 
Verwandte Themen