Gibt es eine versteckte Ruby/Rails-Magie, um eine Methode nur aufzurufen, wenn sie existiert?
Sagen wir, ich möchte anrufen
resource.phone_number
aber ich weiß nicht vorher, ob die Ressource auf phone_number
reagiert. Ein Weg dies zu tun ist
resource.phone_number if resource.respond_to? :phone_number
Das ist gar nicht so schön, wenn man es an der falschen Stelle benutzt. Ich bin neugierig, ob etwas existiert, das mehr in der Art und Weise funktioniert, wie try
verwendet wird (resource.try(:phone_number)
).
Wenn Sie mit der Standard-Ruby-Syntax dafür nicht zufrieden sind, können Sie:
class Object
def try_outside_Rails(meth, *args, &cb)
self.send(meth.to_sym, *args, &cb) if self.respond_to?(meth.to_sym)
end
end
Jetzt:
resource.try_outside_Rails(:phone_number)
wird sich wie gewünscht verhalten.
Ich würde defined?
( http://Ruby-doc.org/docs/keywords/1.9/Object.html#defined-3F-method ) versuchen. Es scheint genau das zu tun, wonach Sie fragen:
resource.phone_number if defined? resource.phone_number
Ich weiß, das ist ein sehr alter Beitrag. Wollte aber nur wissen, ob dies eine mögliche Antwort sein könnte und ob die Auswirkungen gleich sind.
resource.try(:phone_number) rescue nil
Vielen Dank
Ab Ruby 2.3.0 (die sich zu diesem Zeitpunkt noch in der Vorschau befindet) können Sie den neuen sicheren Navigationsoperator verwenden:
resource&.phone_number
Wenn sich auch jemand für die gewählte Syntax interessiert, sollten Sie die Diskussion feature request in Rubys Issue-Tracking-System überprüfen. Die Begründung habe ich auch in meiner Antwort hier erklärt.
Ich kann nicht für die Effizienz sprechen, aber so etwas wie ...
Klass.methods.include?(:method_name)
arbeitet für mich in Rails 4