在rails模型中混淆验证错误

时间:2015-07-07 05:36:35

标签: ruby-on-rails

下面是我的模型和控制器,我已经过滤了不必要的行。

class User < ActiveRecord::Base
validates :password, presence: true, on: :create
validates :password_confirmation, presence: true, if: "password.present?"
validates :password, confirmation: true, 
  length: { in: 6..20}, if: "password.present?"
end

和控制器 -

class UsersController < ApplicationController
  def update
    @user = User.find(params[:id])
    if params[:password].present?
      final_params = get_params
    else
      final_params = get_params.delete_if { |k,v| 
        k == "password" or k == "password_confirmation"
      }
    end

    if @user.update(final_params)
      redirect_to @user
    else
      render 'edit'
    end
  end

  private
  def get_params
    params.require(:user).permit(:first_name, :last_name, :email, :date_of_birth, 
    :password,:password_confirmation, :mobile, :country, :state, :city, :pincode)
  end
end

问题是更新数据时,它显示验证错误,即密码确认不能为空。即使我在那个领域输入内容并提交。并找到错误我试图替换“password.present?”来自密码确认验证与“password.exists?”它显示异常存在不是“123456:string”的有效方法。 123456是DB中的当前密码。为什么要检查db的密码?请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

 private void yourActionButtonActionPerformed(java.awt.event.ActionEvent evt) { 

String n1;                                   
n1 = yourTextField.getText();

}

您的问题是第一行...您的参数是if params[:password].present? final_params = get_params else final_params = get_params.delete_if { |k,v| k == "password" or k == "password_confirmation"} end 而非params[:user][:password](您可以在params[:password]方法中看到)

因此,您的代码始终会运行删除密码/确认

的部分

此外:

get_params

在验证中使用一串ruby通常不被认为是好习惯。如何添加这样的方法:

validates :password_confirmation, presence: true, if: "password.present?"

最后,如果没有确认密码确认的长度,你还需要检查密码确认的长度:

validates :password_confirmation, presence: true, if: :confirmation_needed?
def confirmation_needed?
  password.present?
end

答案 1 :(得分:1)

将控制器中的传入参数组合下来绝不是一个好主意。

相反,在模型中加入适当的验证是个好主意!  因此清理了你的控制器。

检查以下代码:

class UsersController < ApplicationController
  def update
    @user = User.find(params[:id])
    redirect_to @user and return  if @user.update_attributes(get_params)
    # render will not be executed if the user is redirected & returned
    render :edit
  end

  private
  def get_params
    params.require(:user).permit(:first_name, :last_name, :email, :date_of_birth, 
    :password, :password_confirmation, :mobile, :country :state, :city, :pincode)
  end
end

修改后的模型:

class User < ActiveRecord::Base
  validates :password, presence: true, on: :create
  # above validation will be effective only for during new record creation.

  # below 2 validations will be cheked only if password is present in the params list.
  validates :password, confirmation: true, 
    length: { in: 6..20 }, if: validate_password? 
  validates :password_confirmation, presence: true, if: validate_password? 

    private
    def validate_password?
      password.present?
    end
end

如果仍然没有帮助,那么尝试调试validate_password中的self对象?方法。在验证方法中使用raise self.inspect来验证传入的参数。 这样你就可以追踪出错的地方。