web-dev-qa-db-fra.com

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

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
68
user3048402

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.

177
tadman

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.

11
user633183