Сохранение модели после обновления атрибута

У меня есть переменная в моей модели, remember_token, которому присваивается значение, и после этого модель успешно save д.

Но с двумя другими переменными - perishable_token а также verified - save не проходит проверки базы данных (я получил откаты). Так что я использовал update_attribute,

Я только что проверил присвоение значения remember_token и сохранение модели в консоли рельсов. save здесь тоже не работает Поэтому я думаю, что разница в before_save фильтры.

user.remember_token = "asdfa"
user.save
....
ROLLBACK

Хотя все работает хорошо, я был бы признателен, если бы вы показали мне причину этого. Может быть есть другие (лучшие) способы?

Заранее спасибо!

Следующее мое User модель.
(Я смоделировал подтверждение по электронной почте после примеров AuthLogic, но не совсем. Также, кредиты к учебнику г-на Хартла.)

# == Schema Information
#
# Table name: users
#
#  id               :integer          not null, primary key
#  name             :string(255)
#  email            :string(255)
#  created_at       :datetime         not null
#  updated_at       :datetime         not null
#  password_digest  :string(255)
#  surname          :string(255)
#  remember_token   :string(255)
#  role             :string(255)
#  perishable_token :string(255)
#  verified         :boolean          default(FALSE)
#

class User < ActiveRecord::Base
  attr_accessible :email, :name, :surname, :password, :password_confirmation
  # attr_reader :perishable_token
  attr_protected :role #look at ROLES 
  has_secure_password

  ROLES = %w[admin moderator editor author banned] << nil

  has_many :courses

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token
  # before_save :generate_perishable_token

  validates :name, presence: true, length: { maximum: 50 }
  validates :surname, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 } #, presence:true >>because there is password_digest
  validates :password_confirmation, presence: true 
  validates :role, inclusion: { in: ROLES }

  default_scope order: 'users.surname ASC'


  def deliver_verification_instructions!
    generate_perishable_token 
    Notifier.verify_email(self).deliver
  end


  def self.find_using_perishable_token(token, 
        age = KarvonSaroy::Application.config.PERISHABLE_TOKEN_VALID_FOR)
    return if token.blank?
    age = age.to_i

    conditions_sql = "perishable_token = ?"
    conditions_subs = [token]

    if column_names.include?("updated_at") && age > 0
      conditions_sql += " and updated_at > ?"
      conditions_subs << age.seconds.ago 
    end

    where(conditions_sql, *conditions_subs).first
  end


  def verify!
    self.update_attribute(:verified, true)
    # self.verified = true
    # self.save
  end

  #used for sessions
  private
    def create_remember_token
      self.remember_token = SecureRandom.urlsafe_base64
    end

    def generate_perishable_token
      # self.perishable_token = SecureRandom.urlsafe_base64
      self.update_attribute(:perishable_token, SecureRandom.urlsafe_base64)
    end

end

1 ответ

Решение

Я предполагаю, что причина, по которой это не сохраняется должным образом, состоит в том, что эта модель, которую вы создали в консоли rails, не проходит установленные вами проверки.

Предложение от Готвы, которое вы используете save! Это также полезно, поскольку это покажет вам, является ли это причиной проблемы.

Другие вопросы по тегам