1

私は Rails 3 アプリに取り組んでおり、koala gem を使用して Facebook グラフ API への接続を取得しています。また、omniauth を使用してユーザーを認証しています。

次のエラーが表示されます。

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'

ruby ドキュメントでは、「メソッドが定義されておらず、method_missing での応答に失敗したレシーバーでメソッドが呼び出されたときに発生します」と書かれています。

しかし、メソッドが定義されているのに、なぜこのエラーが発生するのでしょうか? どうすれば修正できますか?

私の SessionController では、次のようなことを行います。

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

これは私のユーザーモデルです:

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
4

1 に答える 1

1

投稿したコードでdef add_friendsは、実際にはfrom_omniauthクラスメソッド内にあるため、インスタンスメソッドではなくクラスメソッドになります。

それ(およびfacebookメソッド)をそこから移動すれば、問題ありません。facebookインスタンス変数に直接アクセスするのではなく、メソッドを呼び出したいと思うでしょう。

于 2012-06-30T21:22:45.793 に答える