user.save在控制台中返回false,但在通过UI完成时为true

时间:2015-11-29 19:06:38

标签: ruby-on-rails

我是编程/ rails初学者,遇到了一个我无法解决的错误。

我正在使用/了解" has_secure_password"方法。当我尝试在我的控制台中使用不匹配的密码/ confirm_password创建用户时,控制台返回false并且错误是"密码确认不匹配密码"。但是,当我尝试在给定以下代码(+视图)的UI中做同样的事情时,它保存得很好!现在,请注意我的" user_params"方法,我不小心忘了允许":password_confirmation"这就是我首先注意到这个问题的方法。随着":password_confirmation"补充说,视图会抛出错误,但这不是重点。为什么即使没有这个,也会成功创建新的用户记录,密码和密码确认不匹配,即使它没有保存在控制台中?

这是我的用户模型:

class User < ActiveRecord::Base
  has_secure_password

  validates :name, presence: true
  validates :email, presence: true, format: /\A\S+@\S+\z/, uniqueness: {case_sensitive: false}
  validates :password, length: {minimum: 4, allow_blank: true}
end

我的用户控制器:

class UsersController < ApplicationController
def index
    @users = User.all
end

def show
    @user = User.find(params[:id])
end

def new
    @user = User.new
end

def create
    @user = User.new(user_params)
    if @user.save
        redirect_to @user, notice: "Thanks for signing up!"
    else
        render :new
    end
end

private
def user_params
    params.require(:user).permit(:name, :email, :password)
end
end

1 个答案:

答案 0 :(得分:0)

这是因为password_confirmation属性是可选的。当它未提供给has_secure_password的模型时,模型只接受密码。

如果您的密码确认属性未通过user_params在控制器中列入白名单,则根本不会将其传递给模型,这就是不匹配似乎不会引发错误的原因。事实上,验证根本没有发生。

这适用于您的控制台,因为它创建的用户不需要控制器或强参数白名单。