Home > Back-end >  param is missing or the value is empty: room
param is missing or the value is empty: room

Time:11-21

i created an edit page to edit the room(model) and update the form to change the current name and current capacity to whatever we wish but i am getting an error

ActionController::ParameterMissing in RoomsController#edit

param is missing or the value is empty: room

rooms_controller.rb

class RoomsController < ApplicationController
    before_action :set_room, only: %i[show edit update]


    def index
        @rooms = Room.all
    end

    def show
    end
    
    def new
        @room = Room.new
    end

    def create
        @room = Room.new(room_params)   
        respond_to do |format|
            if @room.save
                format.html { redirect_to room_url(@room), notice: "Room was created Successfully" }

            else
                format.html { render :new, status: :unprocessable_entity }
            end 
        end
    end

    def edit
        respond_to do |format|
            if @room.update(room_params)
                format.html { redirect_to room_url(@room), notice: "Room was successfully updated!" }

            else
                format.html { render :edit, status: :unprocessable_entity }
            end
        end

    end
    

    private
        def set_room
            @room = Room.find(params[:id])
        end

        def room_params
            params.require(:room).permit(:name, :capacity)    
        end

        
end

edit.hml.erb

<h2>Edit Room</h2>

<%= render "form", room: @room %>

_form.html.erb

<%= form_with(model: room) do |form| %>


    <% if room.errors.any? %>
        <div style="color: red">
            <h2><%= pluralize(room.errors.count, "errors") %> Prohibited this Room from saving</h2>
        

        <ul>
            <% room.errors.each do |error| %>
                <li><%= error.full_message %></li>
            <% end %>
        </ul>
        </div>

    <% end %>

    <div>
    <%= form.label :name, style: "display: block" %>
    <%= form.text_field :name %>
    </div>

    <div>
    <%= form.label :capacity, style: "display: block" %>
    <%= form.number_field :capacity %>
    </div>

    <div>
    <%= form.submit %>
    </div>

<% end %>

i am using the same partial _form.html.erb for both new.html.erb and edit.html.erb , is it because of using same partial form for edit and new or there is some other reason?

new.html.erb

<h1>New Room</h1>

<%= render "form", room: @room %>

CodePudding user response:

You're using the wrong action.

In Rails flavored REST the edit action responds to a GET /rooms/:id/edit request and just renders the form. It should also be idempotent. There is no room parameter since you're not responding to a form submission.

Updating the resource is done in the update method (PATCH /rooms/:id).

class RoomsController < ApplicationController
  # ...
  
  # you can actually completely omit this method 
  # Rails will implicitly render edit.html.erb anyways
  # GET /rooms/1/edit
  def edit
  end
  
  # PATCH /rooms/1
  def update
    # you don't need to use MimeResponds if you're only responding to HTML requests. KISS
    if @room.update(room_params)
      redirect_to @room, notice: "Room was successfully updated!"         
    else
      render :edit, status: :unprocessable_entity
    end
  end

  # ...
end
  • Related