Oft muss ich überprüfen, ob ein Wert leer ist, und Folgendes schreiben: "Keine Daten vorhanden":
@user.address.blank? ? "We don't know user's address" : @user.address
Und wenn wir ungefähr 20-30 Felder haben, die wir auf diese Weise verarbeiten müssen, wird es hässlich.
Was ich gemacht habe, ist eine erweiterte String-Klasse mit or
Methode
class String
def or(what)
self.strip.blank? ? what : self
end
end
@user.address.or("We don't know user's address")
Jetzt sieht es besser aus. Aber es ist immer noch roh und rau
Wie wäre es besser, mein Problem zu lösen. Vielleicht wäre es besser, die ActiveSupport class
Hilfsmethode oder Mixins oder irgendetwas anderes zu erweitern oder zu verwenden. Welche Ruby-Idealogie, Ihre Erfahrung und Ihre Best Practices mir sagen können.
ruby-on-rails
ruby
fl00r
quelle
quelle
Phrogz gab mir die Idee in PofMagicfingers Kommentar, aber was ist mit dem Überschreiben von | stattdessen?
quelle
Da Sie dies in Ruby on Rails tun, scheint es, als würden Sie mit einem Modell arbeiten. Wenn Sie überall in Ihrer App einen angemessenen Standardwert wünschen, können Sie beispielsweise die
address
Methode für IhrUser
Modell überschreiben .Ich kenne ActiveRecord nicht gut genug, um dafür guten Code bereitzustellen. in der Fortsetzung wäre es so etwas wie:
... aber für das obige Beispiel scheint dies, als würden Sie die Ansichtslogik in Ihr Modell mischen, was keine gute Idee ist.
quelle
Ihre oder Methode kann einige unerwünschte Nebenwirkungen haben, da der alternative (Standard-) Wert immer ausgewertet wird, auch wenn die Zeichenfolge nicht leer ist.
Beispielsweise
würde zusätzliche Arbeit machen, selbst wenn die Adresse nicht leer ist. Vielleicht könnten Sie das ein bisschen aktualisieren (Entschuldigung, dass Sie den Einzeiler verwirrt haben und versuchen, ihn kurz zu halten):
quelle
a=2 ; a == 2 ? "ok" : @b = 3 ; @b; #=> nil
Es ist wahrscheinlich besser, ActiveRecord oder einzelne Modelle anstelle von String zu erweitern.
Aus Ihrer Sicht bevorzugen Sie möglicherweise ein expliziteres Muster wie
quelle
Rubin:
RoR:
quelle