98 votes

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

Souvent j'ai besoin de vérifier si la valeur est vide et écrire que "Pas de données", comme ça:

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

Et quand nous avons eu environ 20-30 champs que nous avons besoin de traiter de cette manière, il devient laid.

Ce que j'ai fait est étendu classe String avec or méthode

class String
  def or(what)
    self.strip.blank? ? what : self
  end
end

@user.address.or("We don't know user's address")

Maintenant, il est à la recherche de mieux. Mais il est encore brut et rugueux

Comment il serait préférable de résoudre mon problème. Il serait peut-être préférable de les prolonger ActiveSupport class ou de l'utilisation de la méthode d'assistance ou de mixin ou quoi que ce soit d'autre. Ce que ruby idéologie, de votre expérience et les meilleures pratiques peuvent dire de moi.

237voto

David Phillips Points 3413

ActiveSupport ajoute une méthode presence à tous les objets renvoyant son destinataire si present? (l'inverse de blank? ) et nil sinon.

Exemple:

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

12voto

Matt Briggs Points 20291

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

 class String
  def |(what)
    self.strip.blank? ? what : self
  end
end

@user.address | "We don't know user's address"
 

2voto

Phrogz Points 112337

Depuis que vous faites cela dans Ruby on Rails, il semble que vous travaillez avec un modèle. Si vous voulais un raisonnable valeur par défaut partout dans votre application, vous pouvez (par exemple) remplacer les address méthode de User modèle.

Je ne sais pas ActiveRecord bien assez pour fournir le bon code pour le présent; dans la Suite il 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 cela semble que vous seriez en mélangeant vue logique dans votre modèle, ce qui n'est pas une bonne idée.

2voto

Tonttu Points 1313

Votre méthode ou 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 mettre à jour cela un peu (désolé d'avoir confondu one-liner, en essayant de faire court):

 class String
  def or what = ""
    self.strip.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 }
 

1voto

maxl0rd Points 1235

Il est probablement préférable d’étendre ActiveRecord ou des modèles individuels au lieu de String.

Selon vous, vous préférerez peut-être un modèle plus explicite, tel que

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X