Ich habe eine Show-Seite für meine Benutzer und jedes Attribut sollte nur auf dieser Seite sichtbar sein, wenn es nicht null und keine leere Zeichenfolge ist. Unten habe ich meinen Controller und es ist ziemlich ärgerlich, @user.city != nil && @user.city != ""
für jede Variable die gleiche Codezeile schreiben zu müssen . Ich bin nicht sehr vertraut mit dem Erstellen eigener Methoden, aber kann ich irgendwie eine Verknüpfung erstellen, um so etwas zu tun : @city = check_attr(@user.city)
? Oder gibt es eine bessere Möglichkeit, dieses Verfahren zu verkürzen?
users_controller.rb
def show
@city = @user.city != nil && @user.city != ""
@state = @user.state != nil && @user.state != ""
@bio = @user.bio != nil && @user.bio != ""
@contact = @user.contact != nil && @user.contact != ""
@twitter = @user.twitter != nil && @user.twitter != ""
@mail = @user.mail != nil && @user.mail != ""
end
quelle
if @user && @user.authenticated
if @user&.authenticated
if object.present?
überif object
, wenn Sie das Objekt später in Dekorateur wickeln, wäre das Ergebnis ändern , wenn Sie verwendet.present?
. philihp.com/2018/prefer-if-object-present-over-if-object.htmlSie können .present verwenden? welches in ActiveSupport enthalten ist.
@city = @user.city.present? # etc ...
Sie könnten es sogar so schreiben
def show %w(city state bio contact twitter mail).each do |attr| instance_variable_set "@#{attr}", @user[attr].present? end end
Es ist erwähnenswert, dass Sie verwenden können, wenn Sie testen möchten, ob etwas leer ist
.blank?
(dies ist das Gegenteil von.present?
).Auch nicht verwenden
foo == nil
. Verwenden Siefoo.nil?
stattdessen.quelle
true
/false
value.reciever.present?
gibt true zurück, wenn derreceiver
Wert nicht leer ist. Weitere Erläuterungen finden Sie in den von mir verlinkten Dokumenten.instance_variable_set("@foo", "bar")
ist das gleiche wie@foo = "bar"
. Es ist nur eine programmatische Methode zum Festlegen von Instanzvariablen ^^