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
?
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
.
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.
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.