2010-09-17 27 views
1

你能告诉我一种更好的方式来编写代码吗?DRY功能更好的方法

使用从facebook获取的数据属性创建用户。

User.create do |user| 
    user.email = data['email'] 
    user.password = Devise.friendly_token 
    user.facebook_uid = data['facebook_uid'] 
    user.first_name = data['first_name'] 
    user.last_name = data['last_name'] 
    user.gender = data['gender'] 
    user.timezone = data['timezone'] 
    user.birthday = data['birthday'] 
    user.link = data['link'] 
    user.locale = data['locale'] 
    user.picture_url = 'https://graph.facebook.com/' + data['facebook_uid'] + '/picture?type=large' 
    user.fb_access_token = access_token 
    end 

回答

0

解决方案1 ​​

User.create do |user| 
    data.each do |k, v| 
    user.send("#{k}=", v) if User.columns_hash.has_key?(k) 
    end 
    user.fb_access_token = access_token 
    user.password = Devise.friendly_token 
    user.picture_url = "https://graph.facebook.com/%s/picture?type=large" % 
         data['facebook_uid'] 
end 

解决方案2

hash = {} 
data.each do |k, v| 
    hash[k]= v if User.columns_hash.has_key?(k) 
end 

hash['fb_access_token'] = access_token 
hash['password'] = Devise.friendly_token 
hash['picture_url'] = "https://graph.facebook.com/%s/picture?type=large" % 
        data['facebook_uid'] 

User.create(hash) 
2
hash['picture_url'] = something 
User.create(hash) 
0

的ActiveRecord的创建方法可以采取属性的哈希值。由于您的散列键与访问器方法完全匹配,因此您可以在设置数据['picture_url']之后以与之前相同的方式传入User.create(散列)。塔斯社的答案基本上是正确的,但更精确地满足你的代码:

data['picture_url'] = 'https://graph.facebook.com/' + data['facebook_uid'] + '/picture?type=large' 
User.create(data) 
+0

如果我不-T都在关键的精确匹配价值和属性? – 2010-09-17 17:28:00

+1

将非确切键的值分配给确切的键。 – Reactormonk 2010-09-18 11:53:46