СУХАЯ функция лучше - PullRequest
       3

СУХАЯ функция лучше

1 голос
/ 17 сентября 2010

Не могли бы вы сказать мне, как написать этот код лучше?

Создание пользователя с атрибутами данных, извлеченными из 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

Ответы [ 3 ]

2 голосов
/ 17 сентября 2010
hash['picture_url'] = something
User.create(hash)
0 голосов
/ 17 сентября 2010

Раствор 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)
0 голосов
/ 17 сентября 2010

Метод create ActiveRecord может принимать хэш атрибутов.Поскольку ваши хеш-ключи в точности соответствуют методам доступа, вы можете просто передать User.create (hash) после установки данных ['picture_url'] так же, как и раньше.Ответ ТАСС по существу правильный, но для более точного соответствия вашему коду:

data['picture_url'] = 'https://graph.facebook.com/'  + data['facebook_uid'] + '/picture?type=large'
User.create(data) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...