J'ai une page d'affichage pour mes utilisateurs et chaque attribut ne devrait être visible que sur cette page, si ce n'est pas nil et pas une chaîne vide. Ci-dessous, j'ai mon contrôleur et il est assez ennuyant de devoir écrire la même ligne de code @user.city != nil && @user.city != ""
pour chaque variable. Je ne suis pas trop habitué à créer mes propres méthodes, mais puis-je en quelque sorte 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?
sers_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 ça pour vous:
def show
@city = @user.city.present?
end
La méthode present?
teste pour not -nil
plus a un contenu. Les chaînes vides, les chaînes composées d'espaces ou de tabulations, sont considérées comme non présentes.
Comme ce modèle est si courant, il existe même un raccourci dans ActiveRecord:
def show
@city = @user.city?
end
C'est à peu près équivalent.
A noter que tester contre nil
est presque toujours redondant. Ruby ne contient que deux valeurs logiquement fausses: nil
et false
. À moins qu'il soit possible qu'une variable soit littérale false
, cela serait suffisant:
if (variable)
# ...
end
Ceci est préférable aux objets habituels if (!variable.nil?)
ou if (variable != nil)
qui apparaissent occasionnellement. Ruby tend à éviter un type d'expression plus réductionniste.
Une des raisons pour laquelle vous souhaitez comparer vs nil
est si vous avez une variable à trois états pouvant être true
, false
ou nil
et que vous devez faire la distinction entre les deux derniers états.
Vous pouvez utiliser . Present? fourni avec ActiveSupport.
@city = @user.city.present?
# etc ...
Vous pourriez même l'é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 l'inverse de .present?
)
Aussi, n'utilisez pas foo == nil
. Utilisez foo.nil?
à la place.