Vérifiez si non nul et non vide dans le raccourci Rails?

J’ai une page de présentation pour mes utilisateurs et chaque atsortingbut ne doit être visible que sur cette page, si elle n’est pas nulle et non vide. Ci-dessous, j’ai mon contrôleur et il est très ennuyeux de devoir écrire la même ligne de code @user.city != nil && @user.city != "" Pour chaque variable. Je ne suis pas trop familier avec la création de mes propres méthodes, mais puis-je créer un raccourci pour faire quelque chose comme ceci: @city = check_attr(@user.city) ? Ou existe-t-il un meilleur moyen de raccourcir cette procédure?

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 

Il y a une méthode qui fait cela pour vous:

 def show @city = @user.city.present? end 

Le present? tests de méthode pour no- nil plus a contenu. Les chaînes vides, les chaînes composées d’espaces ou d’tabs, sont considérées comme absentes.

Comme ce modèle est si commun, il existe même un raccourci dans ActiveRecord:

 def show @city = @user.city? end 

Ceci est à peu près équivalent.

À titre de note, le test vs nil est presque toujours redondant. Il n’y a que deux valeurs logiquement fausses dans Ruby: nil et false . À moins qu’il soit possible qu’une variable soit littérale false , cela suffirait:

 if (variable) # ... end 

Ceci est préférable à l’habituel if (!variable.nil?) Ou if (variable != nil) trucs qui apparaissent de temps en temps. Ruby tend vers un type d’expression plus réductionniste.

Une des raisons pour lesquelles vous voudriez comparer ou non est que si vous avez une variable à trois états qui peut être true , false ou nil et que vous devez faire la distinction entre les deux derniers états.

Vous pouvez utiliser .present? qui est inclus avec ActiveSupport.

 @city = @user.city.present? # etc ... 

Vous pourriez même écrire comme ça

 def show %w(city state bio contact twitter mail).each do |attr| instance_variable_set "@#{attr}", @user[attr].present? end end 

Il est à noter que si vous voulez tester si quelque chose est vide, vous pouvez utiliser .blank? (c’est le contraire de .present? )

De plus, n’utilisez pas foo == nil . Utilisez foo.nil? au lieu.