2013-12-20 110 views
0

我在我的模型中有一個變量,remember_token,分配了一個值,然後模型成功save d。更新屬性後保存模型

但有兩個其他變量 - perishable_tokenverified - save不通過數據庫檢查(我得到了回滾)。所以我用了update_attribute

我剛剛測試了將一個值賦給remember_token並在rails控制檯中保存模型。 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+\-.][email protected][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 
+3

你可以使用'save!' - 這將顯示爲什麼它不能被保存 – gotva

回答

1

我猜想,這是不保存正確的理由是,該模型已創建在導軌控制檯中失敗了您設置的驗證。

由gotva建議您使用save!也是一個有用的建議,因爲這會告訴你這是否是問題的原因。