2017-01-09 2 views
1

J'essaie de comprendre pourquoi je ne peux pas identifier ma méthode. Peut-être que je ne vois pas les choses clairement et fait une petite erreur que quelqu'un peut attraper? Voici mon code et quand je clique sur le bouton j'obtiens cette erreur.Méthode non détectée dans le modèle "méthode non définie` process_uri '"

Modèle utilisateur: lorsque if auth.info.image.present? est transmis le process_uri est appelé, mais ma méthode n'est pas identifié.

def self.from_omniauth(auth) 

anonymous_username = "NewUser#{User.last.id + 1}" 
generated_password = Devise.friendly_token[0,20] 

    user = User.where(:email => auth.info.email, :username => anonymous_username).first 


    if user 
    return user 
    else 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.confirmed_at = Time.now 
     user.fullname = auth.info.name 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.username = anonymous_username 
     user.email = auth.info.email 
     user.password = generated_password 

    end 

if auth.info.image.present? 
    avatar_url = process_uri(auth.info.image) 
    user.update_attribute(:avatar, URI.parse(avatar_url)) 
end 

    end 
end 


private 

    def process_uri(uri) 
    require 'open-uri' 
    require 'open_uri_redirections' 
    open(uri, :allow_redirections => :safe) do |r| 
     r.base_uri.to_s 
    end 
    end 

Comme vous pouvez le voir, j'ai une méthode privée sous def process_uri(uri) .. même quand je sors privé c'est toujours pas remarqué ... merci !!

Répondre

1

Le problème ici est que la méthode privée process_uri est une méthode d'instance, alors que from_omniauth est une méthode de classe. Dans le contexte d'une méthode de classe, l'objet self sur lequel la méthode serait appelée est la classe et non l'instance. Vous obtenez donc une erreur de méthode non définie car il n'existe pas de méthode de classe process_uri. Vous pouvez définir process_uri comme méthode de classe, ou vous pouvez la rendre publique et l'appeler sur l'objet lui-même (par exemple user.process_uri).

+0

Okay! alors devrais-je ajouter 'def self.process_uri (uri)' comme méthode à la place ?? –

+0

Oui, ça devrait marcher. –