参数更新也发送密码 nil
Param update also sending password nil
我有更新方法,我有所有用户字段,我也有密码输入字段,如果用户不想更改密码,我想更新而不更改密码,但如果他更改密码我想更新密码也。但是,如果我添加 params :password 我会收到错误消息,即密码是必填字段。以下是我的控制器更新方法
class UsersController < ApplicationController
before_action :set_user, only: %i[edit update]
def update
@user.attributes = update_params
if @user.save
flash[:notice] = 'User has been successfully updated.'
redirect_to admin_user_path
else
flash[:alert] = 'Please fill all required fields'
redirect_to new_admin_user_url(user: user_params)
end
def user_params
params.require(:user).permit(:first_name,
:last_name,
:email,
:division_id,
:password,
:employee_id)
end
def set_user
@user = User.find(params[:id])
end
end
我对创建方法使用了相同的参数,这个是压缩代码,因为实际上代码非常大。如果我删除 :password 然后它会更新其他字段,但我想如果密码为空那么它不应该更新既不验证,但如果它不为空那么它也应该更新密码。
这是因为当您提交密码字段为空的表单时,参数如下所示:
{
"user": {
"first_name": "Jack",
"last_name": "Sparrow",
"email": "jack@sparrow.com",
"division_id": 3,
"password": "",
"employee_id": 5
}
}
所以您说的是“将密码更新为空白”,而您的验证不允许这样做。只需在不需要时尝试删除参数密码:
def update
if params[:user][:password].blank?
params[:user].delete("password")
end
@user.attributes = update_params
if @user.save
flash[:notice] = 'User has been successfully updated.'
redirect_to admin_user_path
else
flash[:alert] = 'Please fill all required fields'
redirect_to new_admin_user_url(user: user_params)
end
end # Also, this end is missing in your code
Rails 6.1+
Rails 6.1 在ActionController::Parameters
中添加了一些方法来清理您可以使用的参数。添加的方法是 compact
和 compact!
以便从参数哈希中删除 nil 值,以及 compact_blank
和 compact_blank!
以便从参数哈希中删除空白值。
我有更新方法,我有所有用户字段,我也有密码输入字段,如果用户不想更改密码,我想更新而不更改密码,但如果他更改密码我想更新密码也。但是,如果我添加 params :password 我会收到错误消息,即密码是必填字段。以下是我的控制器更新方法
class UsersController < ApplicationController
before_action :set_user, only: %i[edit update]
def update
@user.attributes = update_params
if @user.save
flash[:notice] = 'User has been successfully updated.'
redirect_to admin_user_path
else
flash[:alert] = 'Please fill all required fields'
redirect_to new_admin_user_url(user: user_params)
end
def user_params
params.require(:user).permit(:first_name,
:last_name,
:email,
:division_id,
:password,
:employee_id)
end
def set_user
@user = User.find(params[:id])
end
end
我对创建方法使用了相同的参数,这个是压缩代码,因为实际上代码非常大。如果我删除 :password 然后它会更新其他字段,但我想如果密码为空那么它不应该更新既不验证,但如果它不为空那么它也应该更新密码。
这是因为当您提交密码字段为空的表单时,参数如下所示:
{
"user": {
"first_name": "Jack",
"last_name": "Sparrow",
"email": "jack@sparrow.com",
"division_id": 3,
"password": "",
"employee_id": 5
}
}
所以您说的是“将密码更新为空白”,而您的验证不允许这样做。只需在不需要时尝试删除参数密码:
def update
if params[:user][:password].blank?
params[:user].delete("password")
end
@user.attributes = update_params
if @user.save
flash[:notice] = 'User has been successfully updated.'
redirect_to admin_user_path
else
flash[:alert] = 'Please fill all required fields'
redirect_to new_admin_user_url(user: user_params)
end
end # Also, this end is missing in your code
Rails 6.1+
Rails 6.1 在ActionController::Parameters
中添加了一些方法来清理您可以使用的参数。添加的方法是 compact
和 compact!
以便从参数哈希中删除 nil 值,以及 compact_blank
和 compact_blank!
以便从参数哈希中删除空白值。