I am trying to update the attribute on clicking the button block or unblock. but its not getting updated in database and i get the error param is missing or the value is empty: user
. even when the user id is passed i get this error. I am not able to find where my error is occuring
This is my controller code:
class UserController < ApplicationController
before_action :set_user, only: [ :edit, :update]
# GET /users
# GET /users.json
def index
@users = User.all
end
def edit
end
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to user_index_path, notice: 'User was successfully blocked.' }
else
format.html { render :index }
end
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_user
@user = User.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def user_params
params.require(:user).permit(:active)
end
end
This is my view code
<h1>
User Details
</h1>
<table class="table">
<thead>
<tr>
<th>Users</th>
</tr>
</thead>
<tbody>
<% @users.each do |user| %>
<tr>
<td>
<%= image_tag("/assets/image.jpg", style: "width: 60px; height: 60px;")%>
</td>
<td>
<p class="font-weight-bold"><%= user.name %></p>
<p><%= user.email %></p>
</td>
<td><%= user.active %></td>
<td>
<% if user.active == true %>
<%= button_to "Block", user_path(id: user.id, value: false), class: 'btn btn-outline-dark', :method => :patch %>
<%else%>
<%= button_to "Unblock", user_path(id: user.id, value: true), class: 'btn btn-outline-dark', :method => :patch %>
<%end%>
</td>
</tr>
<% end %>
</tbody>
</table>
Terminal log i get
Started PATCH "/user/5?value=false" for 127.0.0.1 at 2018-04-12 14:49:57 +0530
Processing by UserController#update as HTML
Parameters: {"authenticity_token"=>"RyL/KkxIbVtZXojmERByarlN1qxXH0gK7moq2w5s4ULketOYGh1im+qPLvND2HkOlVC8gePlFyGCns0lf/Z/uQ==", "value"=>"false", "id"=>"5"}
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 ORDER BY `users`.`id` ASC LIMIT 1
User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 LIMIT 1
Completed 401 Unauthorized in 3ms (ActiveRecord: 0.6ms)
ActionController::ParameterMissing - param is missing or the value is empty: user:
app/controllers/user_controller.rb:31:in `user_params'
app/controllers/user_controller.rb:15:in `block in update'
app/controllers/user_controller.rb:14:in `update'
Started POST "/__better_errors/7f240c65d5c4ef9a/variables" for 127.0.0.1 at 2018-04-12 14:49:57 +0530
You require user
param with active
field:
def user_params
params.require(:user).permit(:active)
end
You send just value
param. You need to change your button_to code to sth like
button_to("Block", user_path(id: user.id),
class: 'btn btn-outline-dark', :method => :patch, params: { user: { active: true}}
(or active: false
respectively).
This error comes up when we don't pass the parameter from view properly.
In your case the parameter should come inside the user
hash.
In your private section:-
def user_params
params.require(:user).permit(:active)
end
You are actually expecting the parameters to be enclosed with user
hash.
And as you are expecting the active
attribute inside the user hash, it is giving you the error as param is missing or the value is empty: user
.
Which means it is looking for the active
attribute, which is missing in the incoming parameter.
For example, the parameter which should be hitting your controller should be something like this:-
{"user"=>{"active"=>"true"}, "value"=>"false", "id"=>"5"}
Pass the active parameter from your view page within the user hash and the error will be gone. Moreover you can always learn more about the strong parameters.
In your method user_params
you require the param user
. The links on the buttons only have the get param value
, but not user
.
The get param should be called sth. like user[active]
.
Your block button should look like this:
<%= button_to "Block", user_path(id: user.id, 'user[active]': false), class: 'btn btn-outline-dark', :method => :patch %>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With