Si la chaîne est vide, renvoyer une valeur par défaut

Souvent, je dois vérifier si une valeur est vide et écrire que “Aucune donnée présente” comme ça:

@user.address.blank? ? "We don't know user's address" : @user.address 

Et quand nous avons environ 20-30 champs à traiter, cela devient moche.

Ce que j’ai fait est étendu avec la classe or méthode Ssortingng

 class Ssortingng def or(what) self.ssortingp.blank? ? what : self end end @user.address.or("We don't know user's address") 

Maintenant, ça va mieux. Mais c’est toujours cru et rugueux

Comment serait-il préférable de résoudre mon problème? Peut-être serait-il préférable d’étendre la ActiveSupport class ou d’utiliser une méthode d’assistance, des mixins ou autre. Quelle idole de rbuy, votre expérience et vos meilleures pratiques peuvent me dire.

ActiveSupport ajoute une méthode de presence à tous les objects qui renvoient son récepteur, le cas échéant present? (l’opposé de blank? ), et nil sinon.

Exemple:

 host = config[:host].presence || 'localhost' 

Phrogz m’a en quelque sorte donné l’idée dans le commentaire de PofMagicfingers, mais qu’en est-il de la priorité | au lieu?

 class Ssortingng def |(what) self.ssortingp.blank? ? what : self end end @user.address | "We don't know user's address" 

Comme vous le faites dans Ruby on Rails, il semble que vous travailliez avec un modèle. Si vous vouliez une valeur par défaut raisonnable partout dans votre application, vous pourriez (par exemple) remplacer la méthode d’ address pour votre modèle d’ User .

Je ne connais pas suffisamment ActiveRecord pour fournir un bon code pour cela; dans Sequel ce serait quelque chose comme:

 class User < Sequel::Model def address if (val=self[:address]).empty? "We don't know user's address" else val end end end 

... mais pour l'exemple ci-dessus, il semble que vous mélangez la logique de vue à votre modèle, ce qui n'est pas une bonne idée.

Votre méthode ou votre méthode peut avoir des effets secondaires indésirables, car la valeur alternative (par défaut) est toujours évaluée, même si la chaîne n’est pas vide.

Par exemple

 @user.address.or User.make_a_long_and_painful_SQL_query_here 

ferait un travail supplémentaire même si l’adresse n’est pas vide. Peut-être pourriez-vous le mettre à jour un peu (désolé d’avoir confondu un seul document, en essayant de le garder court):

 class Ssortingng def or what = "" self.ssortingp.empty? ? block_given? ? yield : what : self end end @user.address.or "We don't know user's address" @user.address.or { User.make_a_long_and_painful_SQL_query_here } 

Il est probablement préférable d’étendre ActiveRecord ou des modèles individuels à la place de Ssortingng.

À votre avis, vous préféreriez peut-être un modèle plus explicite comme

 @user.attr_or_default :address, "We don't know the user's address"