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”,效果非常好。这是一个愚蠢的错误,感谢所有看过它的人。
错误信息如下:
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”,效果非常好。这是一个愚蠢的错误,感谢所有看过它的人。