Как настроить атрибуты по умолчанию в модели ruby - PullRequest
1 голос
/ 23 мая 2010

У меня есть модель User, и когда я ее создаю, я хочу прагматически настроить некоторые ключи API, а что нет, а именно:
@user.apikey = Digest::MD5.hexdigest(BCrypt::Password.create("jibberish").to_s)

Я хочу иметь возможность запустить User.create!(:email=>"something@test.com") и заставить его создать пользователя со случайно сгенерированным ключом API и секретом.

В настоящее время я делаю это в контроллере, но когда я пытался добавить пользователя по умолчанию в файл seeds.rb, я получаю ошибку SQL (говорит, что мой apikey равен нулю).

Я попытался переопределить определение save, но, похоже, это вызвало проблемы при обновлении модели, потому что она переопределит значения. Я попытался переопределить определение initialize, но оно возвращает nil:NilClass и ломает вещи.

Есть ли лучший способ сделать это?

Ответы [ 5 ]

4 голосов
/ 23 мая 2010

использовать обратные вызовы и || = (= если объект не равен nil) :)

class User < ActiveRecord::Base
  before_create :add_apikey #or before_save

  private
  def add_apikey
    self.apikey ||= Digest::MD5.hexdigest(BCrypt::Password.create(self.password).to_s)
  end
end

, но вы обязательно должны взглянуть на devise , authlogic или оформление драгоценные камни

1 голос
/ 23 мая 2010

Посмотрите на ActiveRecord :: Callbacks и, в частности, before_validation.

1 голос
/ 23 мая 2010

Что если в вашем определении save вы проверите, является ли apikey значением nil, и если да, то вы его задаете?

0 голосов
/ 23 мая 2010

Я считаю, что это работает ... просто поместите метод в ваш model.

def apikey=(value)  
  self[:apikey] = Digest::MD5.hexdigest(BCrypt::Password.create("jibberish").to_s)  
end
0 голосов
/ 23 мая 2010
class User
    def self.create_user_with_digest(:options = { })
        self.create(:options)
        self.apikey = Digest::MD5.hexdigest(BCrypt::Password.create("jibberish").to_s)
        self.save
        return self
    end
end

Затем вы можете позвонить User.create_user_with_digest (: name => "bob") , и вы получите дайджест, созданный автоматически и назначенный пользователю. Возможно, вы захотите сгенерировать ключ API с помощью другого В библиотеке, кроме MD5, такой как SHA256, вы, вероятно, также должны указать поле, которое можно ввести пользователем, постоянно увеличивающееся число (например, текущую дату-время) и соль.

Надеюсь, это поможет

...