ParameterMissing - 参数缺失或值为空:user

时间:2016-11-09 11:21:25

标签: ruby-on-rails

我需要更改用户类型。完成STI。

单击该链接会传递参数:type。

我的模特:

tbody
    - @users.each do |user|
      tr 
        td = user.email
        td = user.type
        td = link_to "admin", edit_user_path(user, type: 'Admin')
        td = link_to "guest", edit_user_path(user, type: 'Guest')
        td = link_to "seller", edit_user_path(user, type: 'Seller')

浏览

  resources :users 
  resources :admins, controller: :users, :type => "Admin"
  resources :guests, controller: :users, :type => "Guest"
  resources :sellers, controller: :users, :type => "Seller"

的routes.rb

ActionController::ParameterMissing in UsersController#update
param is missing or the value is empty: user

Parameters:

{"_method"=>"patch", "authenticity_token"=>"56bC4iWSsYd+VrN7RV0NCMj4YD+fIMQKb8uKKC9dUkMtOORAilwPlk3oAgT2L8j5qMsH4tNdzy6zbdL5nVVi7Q==", "type"=>"Admin", "id"=>"3"}

错误

  def update
    if current_admin
      if @user.update(user_params)
        redirect_to users_path
      else
        render 'edit'
      end
    end
  end

  private
  def user_params
    params.require(:user).permit(:type)
  end

控制器

{{1}}

为什么会出现这个错误? action需要一个参数:用户,但不是吗?

1 个答案:

答案 0 :(得分:0)

require确保存在参数。如果它存在,则返回给定键的参数,否则引发ActionController::ParameterMissing error

您需要user参数,但参数中缺少该参数。

要想做到这一点,你有很多方法。

方法1:

删除require应该可以解决问题。

<强> params.permit(:type)

<强>方法2:

在编辑表单的输入中添加user[]作为名称。

如果添加编辑表单,请详细说明方法1.

<强>方法3:

另一种解决方案是将用户密钥添加到参数中。

def update
    if current_admin
        params.user = {
            "type": params.type,
            "id": params.id
        }
      if @user.update(user_params)
        redirect_to users_path
      else
        render 'edit'
      end
    end
  end

  private
  def user_params
    params.require(:user).permit(:type)
  end

reference to api documentaiton