2013-08-06 97 views
0

我想從Facebook的一些數據映射到我的用戶類。我現在讀了一些關於繼承,擴展,包括等等的文章。但也許我明白了一些錯誤。 這是Ruby中DataMapping的正確方法嗎?最好的方式來映射數據?

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 

供參考:不要在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

漫長的方法來了,因爲我從附近抓取附近的所有參數... – Jan