2010-03-25 4 views
3

Je développe une application Rails et je voudrais comprendre quand utiliser self.for.Rails: quand utiliser l'auto

Voici le code d'une méthode que je voudrais comprendre. Si c'est possible, j'aimerais avoir une alternative à ce code afin que cela soit plus clair.

def self.for(facebook_id) 
    User.create_by_facebook_id(facebook_id) 
end 
+0

Ceci n'est pas spécifique à Rails, donc je l'ai étiqueté comme tel. –

Répondre

10

auto fait référence à l'objet courant.

Au sein d'une classe, self est utilisé pour définir une méthode de niveau classe.

class Foo 
    def self.for(facebook_id) 
    User.create_by_facebook_id(facebook_id) 
    end 
end 

définit une méthode de classe pour dans la classe Foo. Il est appelé:

Foo.for(facebook_id) 

Vous pouvez rechercher des méthodes de classe sur Google pour en savoir plus.

Il pourrait être qu'une partie de Rails ou un plugin/gem attend que certaines classes auront une méthode de classe « pour » plus de contexte serait utile à cet égard.

Qu'est-ce que la méthode fait

Comme il est courant pour les méthodes de classe, il crée une instance d'une classe. Par exemple, la classe ActiveRecord a une méthode de classe "create" qui tente de créer une instance de la classe de modèle qui a été stockée dans la base de données. Ainsi User.create renverra une instance de la classe User qui a été stockée dans la base de données.

Dans votre code exemple, il appelle une méthode de classe « create_by_facebook_id » qui est fourni par la classe utilisateur dans l'application.

On dirait que la méthode « pour » est utilisé pour cacher des informations car tout qu'il fait est de faire un autre appel de méthode (à User.create_by_facebook)

Ajouté:

Par ailleurs, la valeur de retour par défaut des méthodes Ruby est la valeur de la dernière instruction. Ainsi, votre méthode d'exemple retournera l'instance d'utilisateur nouvellement créée à partir du facebook_id fourni.

0

Il me semble que self.for est juste un alias pour la création d'un utilisateur pour un id facebook. Je pense que self.for devrait en fait être:

def self.for(facebook_id) 
    User.find_or_create_by_facebook_id(facebook_id) 
end 

De cette façon, il recherche l'utilisateur avec cet identifiant facebook, et si l'on ne se trouve pas, crée cet enregistrement et le renvoie. Ensuite, self.for signifie "retourner l'utilisateur pour cet identifiant facebook".

+0

Cette réponse n'a rien à voir avec la question posée qui était: que signifie self dans ce fragment de code ... – severin

+0

Pas nécessairement. Il a demandé ce que signifie self.for, j'ai répondu. Pas besoin de downvote moi parce que vous avez interprété sa question différemment. – mjaz

0

Réponse courte: auto se réfère toujours à l'objet courant. Ainsi, dans une méthode d'instance, self est l'instance, dans une méthode de classe, self est la classe et dans une définition de classe (comme dans votre exemple), self est la classe ...

Pour plus d'informations sur les méthodes de classe et l'extrait de code que vous avez posté, voir la réponse de Larry K.

0

Si ce code est à l'intérieur d'une classe nommée Foo, alors l'alternative pourrait être:

def Foo.for(facebook_id) 
    User.create_by_facebook_id(facebook_id) 
end 

self dans ce contexte est nécessaire si vous avez des méthodes de niveau de classe générique que vous souhaitez pouvoir utiliser à travers plusieurs classes. Vous les ajoutez à Module en utilisant self. pour les définir (comme vous ne connaissez pas le nom de la classe à laquelle ils appartiennent), puis incluez ce module dans votre classe.