2013-08-06 3 views
0

Я хочу сопоставить некоторые данные из facebook в моем классе User. Теперь я прочитал несколько статей о наследовании, расширении, включая и т. Д. Но, может быть, я понимаю что-то не так. Это правильный подход к DataMapping в Ruby?Лучший способ отображения данных?

class User 
    attr_accessible :name, :address 

    def map_facebook 
     FacebookUserMapper.new(facebook_object, self) 
    end 
end 


class FacebookUserMapper 

    def initialize(facebook_user, user) 
     @facebook_user = facebook_user 
     @user = user 
     mapit 
    end 

    def self.map_it() 
     username 
     address 
     return @user 
    end 

    def username 
     @user.username = @facebook_user.name 
    end 

    def address 
     @user.address = @facebook_user.address 
    end  
end 

ответ

0

Я хотел бы сделать так:

def mapFacebook 
    FacebookUserMapper.new(facebook_object, self).call 
end 

class FacebookUserMapper 
    def initialize(facebook_user, user) 
    @facebook_user = facebook_user 
    @user = user 
    end 

    def call 
    username 
    address 

    self 
    end 

    # ... 
end 

FYI: Не добавляйте () вокруг методов в Ruby,

0

лучший способ для отображения объекта facebook на вашу модель пользователя будет это

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.oauth_token = auth.credentials.token 
    user.oauth_expires_at = Time.at(auth.credentials.expires_at) 
    user.save! 
    end 
end 

Auth является лицом книжный объект здесь. tap просто позволяет вам делать что-то с объектом внутри блока и всегда иметь этот блок, который возвращает сам объект.

Это фрагмент кода из Railscasts episode, из которого вы можете получить дополнительную помощь для своего приложения, связанного с facebook.

+0

Это был мой первый подход. CodeClimate говорит, что это длинный метод, и я решил реорганизовать этот метод на небольшие. также лучше проводить тесты. – Jan

+0

Вы вызываете mapit (метод класса) из конструктора через объект. Вы должны скорее назвать «self.class.mapit». И, приступив к тестированию, вы также можете выполнить тест для метода, который я дал. Это не длинный метод, если удалить «связанные с oauth детали» он будет меньше 6 строк. Не уверен, почему CodeClimate ссылается на другой длинный подход. –

+0

Длинный метод пришел, потому что я собираюсь рядом со всеми параметрами из facebook ... – Jan

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