get request to new action using form instead of link causes param is missing or the value is empty error

1,075 views
Skip to first unread message

fugee ohu

unread,
Oct 4, 2019, 3:43:11 AM10/4/19
to Ruby on Rails: Talk
<%= form_tag new_item_path, :method => :get do %>

  <div class="field">
        <%= select_tag(:item_type, options_for_select(Item::ITEM_TYPES)) %>
  </div>

<div class="actions">
    <%= submit_tag "New item" %>
</div>

ActionController::ParameterMissing in ItemsController#new

param is missing or the value is empty: item


In my controller I have the usual filter
    def item_params
      params.require(:item).permit(:item_type, :title,  :item_id, item_ids: [])
    end
...
Started GET "/items/new?item_type=General&commit=New+item&utf8=%E2%9C%93" for 127.0.0.1 at 2019-10-04 03:32:18 -0400
Processing by ItemsController#new as HTML
  Parameters: {"item_type"=>"General", "commit"=>"New item", "utf8"=>"✓"}
Completed 400 Bad Request in 2ms (ActiveRecord: 0.0ms)


 
ActionController::ParameterMissing (param is missing or the value is empty: item):
 
app/controllers/items_controller.rb:109:in `item_params'
app/controllers/items_controller.rb:23:in `new'
 ...

Avdhesh Sharma (ROR)

unread,
Oct 4, 2019, 6:32:20 AM10/4/19
to Ruby on Rails: Talk
Because in form_tag we don't define scope so all parameters comes in params directry.
so you need to fix item_params method
params.permit(:item_type) to permit parameters

your's item_params method is written to permit this params structure
{item: {item_type: q}

fugee ohu

unread,
Oct 4, 2019, 8:13:40 AM10/4/19
to Ruby on Rails: Talk
What does this do?
      if params.fetch(:item, {}).fetch(:item_type, false)

Ariel Juodziukynas

unread,
Oct 4, 2019, 10:26:15 AM10/4/19
to rubyonra...@googlegroups.com

fetch tries to get the value from a hash given a key, the second parameter is a fallback in case the key does not exist on the hash (params), in your case, if params[:item] does not exist, it returns {} so the next .fetch won't fail. now the second .fetch tries to get the value for the key :item_type, if it does not exist y returns "false". fetch is used when you have optional keys on a hash and you need a fallback in case the key is not present

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/52be0f6e-0e44-4a9a-aefb-38a3eb7a555d%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages