Добавление атрибута модели Rails приводит к ошибкам RecordNotSaved - PullRequest
1 голос
/ 22 марта 2011

Я экстраполирую модель User, приведенную в руководстве по Rails, найденному здесь , чтобы узнать больше о создании моделей.Я пытаюсь дать пользователю флаг подтверждения, который изначально установлен в значение false, пока пользователь не подтвердит свою личность, щелкнув ссылку в автоматическом письме, отправленном после регистрации.

Все работало до того, как я добавил подтвержденный атрибут.Я добавил подтвержденный столбец в базу данных посредством миграции, поэтому мне кажется, что ошибка происходит где-то в логике before_save :confirmed_false.

Может кто-нибудь мне помочь?Модель пользователя ниже.

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name,  :presence => true,
                    :length   => { :maximum => 50 }

  validates :email, :presence   => true,
                    :format     => { :with => email_regex },
                    :uniqueness => { :case_sensitive => false }

  validates :password,  :presence     => true,
                        :confirmation => true,
                        :length       => { :within => 6..40 }

  before_save :encrypt_password
  before_save :confirmed_false

  def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
  end

  def self.authenticate(email, submitted_password)
    user = find_by_email(email)
    return nil if user.nil?
    return user if user.has_password?(submitted_password)
  end

  private

    def confirmed_false
      self.confirmed = false if new_record?
    end

    def encrypt_password
      self.salt = make_salt if new_record?
      self.encrypted_password = encrypt(password)
    end

    def encrypt(string)
      secure_hash("#{salt}--#{string}")
    end

    def make_salt
      secure_hash("#{Time.now.utc}--#{password}")
    end

    def secure_hash(string)
      Digest::SHA2.hexdigest(string)
    end
                                                              1,1           Top

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

В вашей миграции, если для подтвержденного столбца задано логическое значение, а для значения по умолчанию установлено значение false, обратный вызов before_save :confirmed_false вообще не требуется, поскольку он всегда будет ложным, когда это новая запись.

Обновлено

class User < ActiveRecord::Base
  # unlike before_save it's only run once (on creation)
  before_create :set_registration_date

  def set_registration_date
    registration_date = Time.now # or Date.today
  end
end
0 голосов
/ 22 марта 2011

Не могу понять, что ты здесь пытаешься сделать.Кажется, вы хотите установить значение по умолчанию для подтвержденного = ложного, а затем изменить его на подтвержденное = истинное, если пользователь нажимает на соответствующую ссылку и отправляет вам правильный токен или что-то в этом роде.

Так чтопоток будет выглядеть примерно так:

  1. Создана пользовательская запись с подтвержденным = false
  2. Нет необходимости, чтобы before_filter делал что-либо еще
  3. Пользовательвыполняет ли какое-либо действие, разрешающее для его подтвержденного столбца значение true
  4. Все еще нет необходимости в before_filter

Для чего before_filter?Вы пытаетесь использовать его для установки по умолчанию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...