下面是我的模型和控制器,我已经过滤了不必要的行。
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的密码?请帮我解决这个问题。
答案 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来验证传入的参数。 这样你就可以追踪出错的地方。