D Kucher
D Kucher

Reputation: 149

Rails: parameter missing in update action

Here's the error message:

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

Full error log

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'

the error highlights this line:

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

the parameters on the error are these:

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

Here's the form I'm using: 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>

here's the controller:

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

Is the error saying that it cannot find the databse, user? Any solutions to this problem?

Upvotes: 4

Views: 1801

Answers (2)

D Kucher
D Kucher

Reputation: 149

Here's the solution I found:

<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>

I just replaced the "@role" with "@user" and it works like a charm. this was a silly mistake, thank you for all who looked at it.

Upvotes: 1

K M Rakibul Islam
K M Rakibul Islam

Reputation: 34318

Your error is saying:

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

because your update_user_params requires user to be present in the params. As it is not present in your params currently, so it's throwing this error.

See here to know how params.require works.

In your form, you can try adding something like this:

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

Upvotes: 3

Related Questions