web-dev-qa-db-fra.com

Confus au sujet de 'respond_to' vs 'respond_to?'

J'apprends Rails avec railstutorial.org, et je suis confus à propos de quelque chose: dans ce chapitre l'auteur nous dit de faire quelques tests dans la console avec le respond_to? méthode sur un objet utilisateur, et cela fonctionne bien. Mais plus tard, lorsque nous écrirons le test pour le :encrypted_password attribut, il utilise respond_to.

Par curiosité, j'ai essayé respond_to dans la console, pour un objet User, et j'obtiens une erreur indiquant que la méthode n'existe pas. Hélas, si j'essaie d'écrire le test en utilisant respond_to? au lieu de respond_to, le test ne s'exécute pas.

Quelqu'un pourrait-il m'expliquer la différence et pourquoi le test ne s'exécute qu'avec respond_to?

71
agente_secreto

Ruby traite ? et ! en tant que caractères réels dans un nom de méthode. respond_to et respond_to? sont différents. ? indique que ceci devrait répondre avec un vrai ou un faux (par convention; ce n'est pas une exigence). Plus précisément:

respond_to? est une Ruby méthode pour détecter si la classe possède une méthode particulière. Par exemple,

@user.respond_to?('eat_food')

retournerait vrai si la classe User a un eat_food méthode dessus.

respond_to est un Rails méthode pour répondre à des types de demande particuliers. Par exemple:

def index
  @people = Person.find(:all)

  respond_to do |format|
    format.html
    format.xml { render :xml => @people.to_xml }
  end
end

Cependant, dans le lien RailsTutorial que vous avez fourni, vous voyez une méthode RSpec should interagir avec RSpec respond_to méthode. Cela ne serait pas disponible dans votre console, sauf si vous exécutez Rails console test.

159
Tim Sullivan

respond_to? est une évaluation booléenne. Le respond_to est utilisé (normalement) pour déterminer les informations d'affichage. Plus d'informations ici . Le respond_to? vérifie si une méthode existe et renvoie true si elle existe et false dans le cas contraire.

4
Micharch54

Le test utilise des aides pratiques pour être plus convivial.

Ruby est Ruby donc en utilisant le bon vieux respond_to? fonctionnerait si vous l'appeliez ainsi:

 @user.respond_to?(:encrypted_password).should be_true

Il y a un autre respond_to utilisé dans les contrôleurs mais toujours rien à voir avec ceux que vous avez déjà rencontrés.

3
apneadiving