2012-07-10 4 views
0

Я создаю приложение, в котором пользователь подписывает бросок на счет facebook, и я хватаю их друзей и их историю образования. Это идет что-то вроде этого:Инициализированная модель друга в рельсах

входе пользователя и идет в SessionsController # Создать:

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

Метод SessionsController создавать вызовы метода .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 вызывает метод 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> 

И я знаю, что это означает, что я должен инициализировать переменную друга, но я понятия не имею о том, как сделать это. Любые идеи, это было бы очень полезно! =)

ответ

2

Использование friend = Friend.new в цикле:

friends_data.each do |hash| 
    friend = Friend.new # <----------- 
    friend.name = hash["name"] 
    friend.uid = hash["id"] 
+0

Да, это работа, спасибо! – SHUMAcupcake

+0

Одна из проблем, моя модель друга выглядит так: [uid, name, highschool_name, graduateschool_name, user_id, created_at, updated_at], но user_id пуст. Так что я должен сэкономить по-другому, любые идеи? моя схема выглядит так: https://gist.github.com/3083962 – SHUMAcupcake

+0

Зависит от значения 'user_id'. Если это текущий идентификатор пользователя, используйте команду 'friend.user_id = self.id'. Если нет, укажите значение поля. – Matzi

0

Сначала вам нужно Friend модель:

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

В другом классе поставил belongs_to:

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 
+0

У меня есть модель друга, как будто, но без атрибута: foreign_key =>: uid, почему вы используете эту активную запись doave, которая автоматически берется за нее? – SHUMAcupcake

+0

Rails по умолчанию угадывает 'foreign_key' как имя ассоциации с« _id », поэтому в вашей модели это будет' user_id', а не 'uid'. Взгляните на: [ActiveRecord :: Associations :: ClassMethods] (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html) – rogal111

+1

Вы правы, но моя схема выглядит так: https://gist.github.com/3083962, и я заметил, что в индексе ничего не происходит. – SHUMAcupcake

Смежные вопросы