2012-06-30 1 views
1

레일 3 앱에서 코알라 보석을 사용하여 페이스 북 그래프 API에 연결합니다. 또한 omniauth를 사용하여 사용자를 인증합니다. 루비 문서에서NoMethodError in SessionsController # 사용자 모델에서 메소드를 호출 할 때 생성

NoMethodError in SessionsController#create 
undefined method `add_friends' for #<User:0x007fcfcb1a87e8> 

app/models/user.rb:28:in `block in from_omniauth' 
app/models/user.rb:6:in `tap' 
app/models/user.rb:6:in `from_omniauth' 
app/controllers/sessions_controller.rb:3:in `create' 

는 말한다 :

나는 다음과 같은 오류 얻을. "방법은이 정의도 method_missing에 응답하지가없는 수신기에 호출 될 때 제기를"

하지만 metod가 정의되어 있는데 왜이 오류가 발생합니까? 어떻게 해결할 수 있습니까? 내 SessionController에서

나는 같은 것을 할 : 당신이 def add_friendsfrom_omniauth 클래스 메소드 등의 내부에 실제로 게시 된 코드에서

class User < ActiveRecord::Base 
    #attr_accessible :provider, :uid, :token, :email, :name, :first_name, :last_name, :image, :gender, :location, :school, :year 
    has_many :friends 

    def self.from_omniauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user| 
     user.provider = auth["provider"] 
     user.uid = auth["uid"] 
     user.name = auth["info"]["name"] 
     user.first_name = auth["info"]["first_name"] 
     user.last_name = auth["info"]["last_name"] 
     user.image = auth["info"]["image"] 
     user.email = auth["info"]["email"] 
     user.gender = auth["extra"]["raw_info"]["gender"] 
     user.location = auth["extra"]["raw_info"]["location"]["name"]   
     user.token = auth["credentials"]["token"] 

     user.add_friends 
     user.save! 
     user 

    end 

    def add_friends 
     @facebook.get_connections("me", "friends").each do |hash| 
     self.friends.find(:name => hash['name'], :uid => hash['id']).first_or_create 
     end 
    end 

    private 

    def facebook 
     @facebook ||= Koala::Facebook::API.new(token) 
    end 
    end 
end 

답변

1

:

class SessionsController < ApplicationController 
    def create 
    user = User.from_omniauth(env['omniauth.auth']) 
    session[:user_id] = user.id 
    redirect_to root_url, notice: "Signed in!" 
    end 
end 

이 내 사용자 모델입니다 인스턴스 메소드가 아닌 클래스 메소드이기도합니다.

이동하여 (그리고 페이스 북 방법) 거기 밖으로 이동하고 확인해야합니다. 인스턴스 변수에 직접 액세스하는 대신 facebook 메서드를 호출하고 싶을 수도 있습니다.

+0

당신은 나에게 다음과 같은 방법을 보여 주시겠습니까? https://gist.github.com/3025599 이제 get_connections insted를 얻습니다 : 정의되지 않은 메소드'get_connections 'for nil : NilClass – SHUMAcupcake

+0

당신이 사용하고 있습니다. '@ facebook'을 설정하지 않아도됩니다. do

+0

을 입력하십시오. # SHUMAcupcake