alias_attribute и устройство, приводящее к слишком глубокой ошибке на уровне стека - PullRequest
2 голосов
/ 27 марта 2012

Я сталкиваюсь с некоторыми немного сложными проблемами с устаревшей БД.Кажется, все работает нормально, если я просто изменил имя столбца «пароль» в БД на «encrypted_password»;однако мне нужно оставить базу данных на месте.

Поэтому я решил использовать

alias_attribute :encrypted_password, :password

Теперь я получаю сообщение об ошибке «слишком большой уровень стека» в консоли.

Моя модель пользователя:

class User < ActiveRecord::Base
  require "digest/sha1"
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :encryptable, :encryptor => :old_cakephp_auth

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
  has_many :events

  before_create :add_default_values

  #alias_attribute :created_at, :created  
  #alias_attribute :updated_at, :updated
  alias_attribute :encrypted_password, :password

  def add_default_values
    self.created = Time.now
    self.updated = Time.now
    self.image = ""
    self.name = self.email.split("@").first
    #make normal user
    self.role_id = 2
    self.username = self.email.split("@").first + rand(100000000000000).to_s
    self.website = ""
  end

  def valid_password?(password)
    return false if encrypted_password.blank?
    Devise.secure_compare(Digest::SHA1.hexdigest(self.password_salt+password), self.encrypted_password)
  end
end

Идеи?Спасибо!!!:)

1 Ответ

2 голосов
/ 27 марта 2012

Я полагаю, что это связано с тем, что мы зарезервировали слово password для собственного использования (и оно, в свою очередь, вызывает encrypted_password. Попробуйте переименовать его в pword и посмотреть, если ошибка по-прежнему возникает. Если это не такт, вам нужно будет найти другое имя для вызова псевдонима пароля.

Я должен сказать, что это всего лишь предположение. Дайте мне знать, если это поможет.

...