参数更新也发送密码 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 中添加了一些方法来清理您可以使用的参数。添加的方法是 compactcompact! 以便从参数哈希中删除 nil 值,以及 compact_blankcompact_blank! 以便从参数哈希中删除空白值。