Каков контекст методов, вызываемых before_save в модели Rails 3? - PullRequest
0 голосов
/ 07 января 2011

Я, честно говоря, понятия не имел, как это назвать по-другому (или что на самом деле искать).

Итак, в моем ActiveRecord (... app / model / s / account.rb /) у меня есть следующее:

validates :username, :password, :email, :presence => true
validates :username, :email, :uniqueness => true
validates :username, :length => { :within => 5..30}
validates :password, :length => { :within => 6..128}
validates :password, :confirmation => true
validates :email, :format => { :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i }
before_save :encrypt_password

private

    def encrypt_password
        require "digest"
        @account.password = Digest::SHA1.hexdigest(@account.password)
    end

И я получаю ошибку:

неопределенный метод `пароль 'для nil: NilClass

Почему он сообщает @account как ноль? Ну, может быть потому, что @account не существует вне View / Controller, но я (честно говоря, бог) не мог придумать какой-либо другой способ сделать это.

P.S .: Я попытался поместить encrypt_password в контроллер; это все еще не работало (другая ошибка, хотя).

Ответы [ 2 ]

4 голосов
/ 07 января 2011

Измените метод следующим образом:

def encrypt_password
  require 'digest'
  self.password = Digest::SHA1.hexdigest(self.password)
end

Переменная экземпляра @account, которую вы используете в контроллере и представлении, относится к экземпляру класса Account, над которым вы работаете в этом файле. Итак, по-видимому, вы делаете что-то вроде этого в контроллере:

@account = Account.new(params)
@account.save!

Экземпляр класса Account получает 'save!' call и запускает свой обратный вызов before_save, где он должен называть себя 'self', а не @account (это имя, которое ваш контроллер имеет для него).

Примечание: вам нужно указывать «дайджест» вверху файла класса, а не внутри метода - нет необходимости загружать библиотеку дайджестов каждый раз, когда вы хотите хешировать пароль. *

0 голосов
/ 07 января 2011

Вы должны попробовать

 def self.hash_password(password = '')
      self.password = Digest::SHA1.hexdigest(password)
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...