Rails - 更新数据库中的模型

时间:2011-06-18 21:46:27

标签: ruby database ruby-on-rails-3

所以我遇到了一个验证问题 - 我创建了一个验证,以确保数据库中没有用户共享相同的电子邮件地址。然后我在数据库中创建了一个用户。之后,我说user = User.find(1)返回了我刚刚创建的用户。然后我想更改其名称,所以我说user.name = "New Name"然后尝试使用user.save将其保存回数据库。但是,此命令不再起作用(它返回false),我认为它与我的唯一性验证测试有关。有人可以帮我解决这个问题吗?

# == Schema Information
#
# Table name: users
#
#   id         :integer         not null, primary key
#  name       :string(255)
#  email      :string(255)
#  created_at :datetime
#  updated_at :datetime
#

class User < ActiveRecord::Base
    attr_accessor :password

    attr_accessible :name, :email,                    #says that the name and email attributes are publicly accessible to outside users.
                    :password, :password_confirmation #it also says that all attributes other than name and email are NOT publicly accessible.
                                                      #this protects against "mass assignment"

    email_regex = /^[A-Za-z0-9._+-]+@[A-Za-z0-9._-]+\.[A-Za-z0-9._-]+[A-Za-z]$/ #tests for valid email addresses.


    validates :name, :presence => true,
                     :length => {:maximum => 50}
    validates :email, :presence => true,
                      :format => {:with => email_regex},
                      :uniqueness => {:case_sensitive => false}
    validates :password, :presence => true,
                         :length => {:maximum => 20, :minimum => 6},
                         :confirmation => true

    before_save :encrypt_password

    def has_password?(submitted_password)
        #compare encrypted_password with the encrypted version of the submitted password.
        encrypted_password == encrypt(submitted_password)
    end

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

    private

        def encrypt_password 
            if (new_record?) #true of object has not yet been saved to the database
                self.salt = make_salt
            end
            self.encrypted_password = encrypt(password)
        end

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

        def secure_hash(string)
            Digest::SHA2.hexdigest(string) #uses cryptological hash function SHA2 from the Digest library to encrypt the string.
        end

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

1 个答案:

答案 0 :(得分:0)

尝试保存!并查看异常告诉你的内容