it-swarm.com.de

Rufen Sie die Methode nur auf, wenn sie existiert

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)).

53
Frans

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.

34

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
12
jmarceli

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

12
Bc91

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.

6
Roope Hakulinen

Ich kann nicht für die Effizienz sprechen, aber so etwas wie ...

Klass.methods.include?(:method_name) 

arbeitet für mich in Rails 4

1
Stephen