我遇到了问题,我需要了解如何修复更新方法。我有一个管理面板,我可以在其中创建用户。此表单包括名称,邮件,密码,重复的密码字段,它工作正常。然后我想要一个包含所有用户的列表并编辑我想要的人。问题是我想编辑部分信息,这些信息未包含在注册表中,默认为空。在编辑模式下,我的表单有两个新字段 - 笔记和缺席。当我更改这些字段并调用更新方法时,我看到密码和重复密码不匹配的消息,这是注册中的验证,但我没有这些文件处于编辑模式。我怎么能解决这个问题。这是我的代码的一部分:
class UsersController < ApplicationController
def edit
@user = User.find(params[:id])
@title = "Edit user"
end
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
flash[:success] = "Profile updated."
redirect_to @user
else
@title = "Edit user"
render 'edit'
end
end
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :email, :password, :password_confirmation
validates :name, :presence => true,
:length => { :maximum => 50 }
validates :email, :presence => true
email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, :presence => true,
:format => { :with => email_regex },
:uniqueness => true
validates :password, :presence => true,
:confirmation => true,
:length => { :within => 6..40 }
before_save :encrypt_password
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
def self.authenticate_with_salt(id, cookie_salt)
user = find_by_id(id)
(user && user.salt == cookie_salt) ? user : nil
end
private
def encrypt_password
self.salt = make_salt unless has_password?(password)
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
end
答案 0 :(得分:0)
在创建用户时,密码存在的验证是正确的,但是一旦用户拥有加密密码,您不希望将来强制它出现在所有表单提交中。
活动记录支持为验证添加条件,因此我建议在密码验证上设置一个条件,使其仅在用户对象尚未加密密码时执行。相关的片段是:
validates :password, :presence => true,
:confirmation => true,
:length => { :within => 6..40 },
:if => :needs_password?
def needs_password?
encrypted_password.nil?
end