2010-09-17 4 views
1

pourriez-vous me dire un moyen d'écrire ce code d'une meilleure manière?La fonction DRY d'une meilleure manière

Créez un utilisateur avec les attributs de données récupérés sur 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 

Répondre

0

Solution 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 

Solution 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

créer de ActiveRecord méthode peut prendre un hachage d'attributs. Comme vos clés de hachage correspondent exactement aux méthodes d'accesseur, vous pouvez simplement passer dans User.create (hash) après avoir défini les données ['picture_url'] de la même manière que précédemment. La réponse de Tass est essentiellement correcte, mais plus précisément correspondre votre code:

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

Et si je ne t ont la correspondance exacte entre les principaux valeur et attribut? –

+1

Affecte la valeur de la clé non exacte à une clé exacte. – Reactormonk