2017-01-09 3 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

うん、それは動作するはずです。 –

関連する問題