update_attributes更新一定要所有的属性都写上吗?怎么写部分的属性不能更新成功呢?
页面部分,如果点了修改密码的checkbox会把新密码的两个文本框显示出来,让用户输入新的密码..否则是不能输入的..
[code="html"]
<% form_tag :action => "update",:id => @user do %>
<%= error_messages_for 'user' %> | |
名字: | <%= @user.name %> |
旧密码: |
<%=password_field :user, :old_password, :size => 15 %> <%=check_box_tag :change_password, "true",false,:onclick => "changePassowrd(this)" %>修改密码 $('change_password').checked = false; |
密码: | <%=password_field :user, :password, :size => 15 %> |
确认密码: | <%=password_field :user, :password_confirmation, :size => 15 %> |
权限: | <%= select(:user, :level , @types) %> |
<%= submit_tag "修改用户信息" %> <%= return_page "返回" , :type => "button" %> |
<%end %>
[/code]
在Controller上判断是否需要修改密码,如果不需要修改密码会把参数里边的两个密码删除,不然密码就为空了...
然后更新,没有任何异常的执行成功,但是没有更新成功~!
如果将
params[:user].delete("password_confirmation")
params[:user].delete("password")
替换成
params[:user][:password_confirmation] = params[:user][:old_password]
params[:user][:password] = params[:user][:old_password]
就能正常更新成功!
这是为什么?
[code="ruby"]
def update
@user = User.find params[:id]
if request.post?
#如果修改密码,而且新密码为空,提示错误,否则将新密码设置和旧密码一样
if params[:change_password] and params[:user][:password].empty?
flash[:notice] = "必须输入新密码"
redirect_to :action => :update
else
params[:user].delete("password_confirmation")
params[:user].delete("password")
end
#如果旧密码为空,提示信息
if params[:user][:old_password].empty?
flash[:notice] = "必须输入旧密码"
redirect_to :action => :update
#如果旧密码相同,进行修改
elsif User.authenticate @user.name,params[:user][:old_password]
params[:user].delete("old_password")
@user.update_attributes(params[:user])
flash[:notice] = "修改成功";
redirect_to :action => :index
else
flash[:notice] = "旧密码错误"
end
end
end
[/code]