0

ユーザーがサインインしてFacebookアカウントをスローし、友人と教育履歴を取得するアプリを構築しています。次のようになります。

ユーザーはサインインし、SessionsController#Create に移動します。

class SessionsController < ApplicationController
  def create
    user = User.from_omniauth(env['omniauth.auth'])
  end
end

SessionsController メソッド create は、User モデルでメソッド .from_omniauth を呼び出します。

def self.from_omniauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      ...more code... 
      user.save!
      user.add_friends
    end
end

.from_omniauth メソッドは、User モデル内にあるメソッド add_friends を呼び出します。

def add_friends
    friends_data =  facebook.get_connections("me", "friends",   :fields => "name, id, education")
    friends_data.each do |hash|
      friend.name = hash["name"]
      friend.uid = hash["id"]

      if hash["education"]
        hash["education"].each do |e|
          if e["type"] == "High School"
            friend.highschool_name = e["school"]["name"] if (!hash["education"].blank? && !e["school"].blank?)

          elsif e["type"] == "Graduate School"
            friend.graduateschool_name = e["school"]["name"] if (!hash["education"].blank? && !e["school"].blank?)
          end
        end
      end
      friend.save!
      friend
    end
  end

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

NameError in SessionsController#create
undefined local variable or method `friend' for #<User:0x007fad11d50eb0>

これは、変数の友人を初期化する必要があることを意味しますが、その方法についてはわかりません。どんなアイデアでも、とても役に立ちます!=)

4

2 に答える 2

2

friend = Friend.newループでの使用:

friends_data.each do |hash|
    friend = Friend.new   # <-----------
    friend.name = hash["name"]
    friend.uid = hash["id"]
于 2012-07-10T14:41:54.393 に答える
0

最初に Friend モデルが必要です:

rails g model Friend user_id:integer uid:string name:string highschool_name:string graduateschool_name:string
rake db:migrate

フレンドクラスに属している場所を入れます:

class Friend < ActiveRecord::Base
   belongs_to :user
end

ユーザークラスに has_many を入れます:

class User < ActiveRecord::Base
   has_many :friends
end

add_friend メソッドは次のようになります。

def add_friends
    friends_data =  facebook.get_connections("me", "friends",   :fields => "name, id, education")
    friends_data.map do |hash|
      friend=Friend.new
      friend.name = hash["name"]
      friend.uid = hash["id"]
      friend.user_id = self.id

      if hash["education"]
        hash["education"].each do |e|
          next if e["school"].blank?
          if e["type"] == "High School"
            friend.highschool_name = e["school"]["name"]
          elsif e["type"] == "Graduate School"
            friend.graduateschool_name = e["school"]["name"]
          end
        end
      end
      friend.save!
      friend
    end
  end
于 2012-07-10T14:50:49.663 に答える