Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用rails Desive,空密码字段不';调试(参数)中是否不存在?_Ruby On Rails_Devise_Passwords_Params - Fatal编程技术网

Ruby on rails 使用rails Desive,空密码字段不';调试(参数)中是否不存在?

Ruby on rails 使用rails Desive,空密码字段不';调试(参数)中是否不存在?,ruby-on-rails,devise,passwords,params,Ruby On Rails,Devise,Passwords,Params,我是rails和Desive的新手,所以我正在努力了解到底发生了什么。我遵循Desive wiki,允许用户编辑自己的密码,可在此处找到: 我感到困惑的是,即使我在我的模型中使用:validable,似乎我也能够提交表单,即使我将password/password\u confirmation留空,只要我填写了当前的\u密码。这似乎与以下事实有关:在中,只有在以下情况下才有密码验证!密码。零 所以我决定在表单提交时查看debug(params),如果我将password/password_确认字

我是rails和Desive的新手,所以我正在努力了解到底发生了什么。我遵循Desive wiki,允许用户编辑自己的密码,可在此处找到:

我感到困惑的是,即使我在我的模型中使用:validable,似乎我也能够提交表单,即使我将password/password\u confirmation留空,只要我填写了当前的\u密码。这似乎与以下事实有关:在中,只有在以下情况下才有密码验证!密码。零

所以我决定在表单提交时查看debug(params),如果我将password/password_确认字段留空,那么password/password_确认根本不会出现在params散列中(尽管password.nil?是真的?)


我不明白的是为什么会这样?即使我将password字段留空,password不应该像任何其他字段一样出现在params中,如“password”=>“”?由于我正在使用自己的控制器操作来处理表单,为什么密码不在params中?

在wiki页面上使用的
update\u with\u password
方法会引起您的混淆。如果参数为空,则会从参数中删除
密码
密码确认

这似乎是wiki页面上的一个疏忽,因为它描述了如何实现您自己的更改密码操作。在这种情况下,这肯定是一个问题(提交“更改密码”表单而不填写密码可能会失败)

无论如何,您可以解决这个问题,并且仍然使用
update\u with\u password
方法,只需事先检查密码是否为空,类似这样(根据需要重构):


如何确定参数中未传递密码和确认字段?你在记录吗?实际上,我只是用Desive组装了一个赤裸裸的Rails应用程序,看看是否会发生这种情况,但对我来说并没有。正如您所期望的,在参数中它们是空字符串。在Desive的wiki页面()中找到的控制器操作中,我将此添加到更新密码操作的开头:
flash[:notice]=params[:user]
当我在表单上将密码/密码确认字段留空时,flash通知仅声明“{}”。但是,我确实在服务器控制台中看到“password”=>“[FILTERED]”@numbers1311407基于您编写的内容,我决定尝试添加if语句来测试提交空白密码字段时if
params[:user][:password].nil?
。你是对的,字段不是零,只是空白。我猜现在我不明白为什么
flash[:notice]=params[:user]
只返回{}?由于密码是空的,我本以为设备的validatable会在提交空白密码时发现验证错误。非常感谢!这真的很有道理!我想投票,但似乎还不能。我想我将使用我的用户模型中的条件验证,以及我的表单中的TraceWrror和隐藏字段,来触发空白密码字段验证。类似于
验证:password,:presence=>true,:if=>:should\u validate\u password?
。我在想,这可能更符合rails的理念,瘦控制器,胖模型?是的,我确实想过建议隐藏场路线,但只是想说清楚。你说得对,这是一个更好的解决方案:-)
def update_password
  @user = User.find(current_user.id)

  if params[:user][:password].blank?
    @user.errors.add(:password, :blank)
    render "edit"
  elsif @user.update_attributes(params[:user])
    # Sign in the user by passing validation in case his password changed
    sign_in @user, :bypass => true
    redirect_to root_path
  else
    render "edit"
  end
end