2017-01-09 10 views
1

Я пытаюсь выяснить, почему я не могу определить свой метод. Может быть, я не видел вещи ясно и сделал небольшую ошибку, которую кто-то может поймать? Вот мой код, и когда я нажимаю на кнопку, я получаю эту ошибку.Метод не обнаружен в модели «неопределенный метод` process_uri »

Модель Пользователь: когда if auth.info.image.present? получает прошел process_uri вызывается, но мой метод не определен.

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 

Как вы можете видеть, у меня есть частный метод под def process_uri(uri) .. даже когда я вынимаю частное это еще не заметило ... спасибо !!

ответ

1

Проблема заключается в том, что частный метод process_uri является методом экземпляра, тогда как from_omniauth - метод класса. В контексте метода класса объект self, к которому будет вызван метод, представляет собой класс, а не экземпляр, поэтому вы получаете неопределенную ошибку метода, потому что нет метода класса process_uri. Вы можете определить process_uri как метод класса, или вы можете сделать его общедоступным и вызвать его на самом объекте (например, user.process_uri).

+0

Хорошо! поэтому я должен добавить 'def self.process_uri (uri)' как мой метод вместо? –

+0

Да, это должно сработать. –