71 votes

Confusion entre "respond_to" et "respond_to" ?

Je suis en train d'apprendre Rails avec railstutorial.org, et je suis confus à propos de quelque chose : dans ce chapitre l'auteur nous dit de faire des tests dans la console avec la fonction respond_to? sur un objet User, et cela fonctionne bien. Mais plus tard, lorsque nous écrivons le test pour la méthode :encrypted_password il utilise l'attribut respond_to .

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

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

160voto

Tim Sullivan Points 10677

Les friandises de Rubis ? y ! comme des caractères réels dans un nom de méthode. respond_to y respond_to? sont différentes. ? indique que cette debe répondre par un vrai ou un faux (par convention ; ce n'est pas une obligation). Plus précisément :

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

@user.respond_to?('eat_food')

retournerait vrai si le User La classe a un eat_food sur celui-ci.

respond_to est un Rails méthode pour répondre à des types de demandes 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 RSpec méthode should en interagissant avec le système RSpec respond_to méthode. Cela ne serait pas disponible dans votre console, sauf si vous exécutez rails console test .

4voto

Micharch54 Points 375

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

3voto

apneadiving Points 64660

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

Ruby est Ruby donc utiliser le bon vieux respond_to? fonctionnerait si vous l'appelez de cette façon :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X