Rails:更新操作中缺少参数

Rails: parameter missing in update action

错误信息如下:

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

完整的错误日志

ActionController::ParameterMissing (param is missing or the value is empty: user):
  app/controllers/users_controller.rb:36:in `update_user_params'
  app/controllers/users_controller.rb:15:in `update'

错误突出显示了这一行:

def update_user_params
      params.require(:user).permit(:role)
    end

错误的参数是这些:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"NVSo53F3PFIhOxDthMFCAxgTIDAewnxppsGTNzkp/Zc=",
 "admin"=>{"role"=>"user"},
 "commit"=>"Make User",
 "id"=>"2"}

这是我使用的表格:show.html.erb

<tr id="dashfield">
    <td><%= @user.first_name%></td>
    <td><%= @user.last_name %></td>
    <td><%= @role %></td>
    <td><% if @role == 'admin'%>
          <%= form_for @role, method: :put do |f|%>
          <%= f.hidden_field :role, :value => 'user'%>
          <%= f.submit 'Make User'%><%end%>
          <%else%>
          <%= form_for @role, method: :put do |f| %>
          <%= f.hidden_field :role, :value => 'admin'%>
          <%= f.submit 'Make Admin'%>
          <%end%>
          <%end%></td>
</tr>

这是控制器:

class UsersController < ApplicationController
  def new
    @user = User.new
  end
  def index
    @allusers = User.all
  end
  def show
    @user = User.find(params[:id])
    @role = @user.role
  end
  def update
    @user = User.find(params[:id])
    if @user.update(update_user_params)
    redirect_to '/users'
    else
      redirect_to "/users/#{id}"
    end
  end
  def create
    @user = User.new(user_params)
    @user.role = 'user'
    if @user.save
      session[:user_id] = @user.id
      redirect_to '/hours/new'
    else
      redirect_to '/signup'
    end
  end
  private
  def user_params
    params.require(:user).permit(:first_name, :last_name, :email, :password)
  end
    def update_user_params
      params.require(:user).permit(:role)
    end
end

错误是说找不到数据库,用户?这个问题有什么解决办法吗?

你的错误是:

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

因为您的 update_user_params 要求 user 出现在参数中。由于它目前不在您的参数中,因此会引发此错误。

请参阅 here 了解 params.require 的工作原理。

在您的表单中,您可以尝试添加如下内容:

<%= f.hidden_field :user, { :value => @user } %>

这是我找到的解决方案:

<td><% if @role == 'admin'%>
          <%= form_for @user, method: :put do |f|%>
          <%= f.hidden_field :role, :value => 'user'%>
          <%= f.submit 'Make User'%><%end%>
          <%else%>
          <%= form_for @user, method: :put do |f| %>
          <%= f.hidden_field :role, :value => 'admin'%>
          <%= f.submit 'Make Admin'%>
          <%end%>
          <%end%></td>

我刚刚将“@role”替换为“@user”,效果非常好。这是一个愚蠢的错误,感谢所有看过它的人。