Posted over 5 years ago. Visible to the public.

A hidden field on collection radio buttons

Consider the following form which has only one input role_id which is accepted through collection_radio_button.

Copy
<%= form_for(@user) do |f| %> <%= f.collection_radio_buttons :role_id, @roles, :id, :name %> <div class="actions"> <%= f.submit %> </div> <% end %>

In the controller, we can access role_id using the strong parameters.

Copy
def user_params params.require(:user).permit(:role_id) end

When we try to submit this form without selecting any radio button in Rails 4.x, we will get 400 Bad Request error with following message.

Copy
ActionController::ParameterMissing (param is missing or the value is empty: user):.

This is because following parameters were sent to server in Rails 4.x

Copy
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "commit"=>"Create User"}

According to HTML specification, when multiple parameters are passed to collection_radio_buttons and no option is selected, web browsers do not send any value to the server.

Solution in Rails 5

Rails 5 adds hidden field on the collection_radio_buttons to avoid raising an error when the only input on the form is collection_radio_buttons. The hidden field has the same name as collection radio button and has blank value. Following parameters will be sent to server in Rails 5 when above user form is submitted:

Copy
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"role_id"=>""}, "commit"=>"Create User"}

In case we don’t want the helper to generate this hidden field, we can specify include_hidden: false.

Copy
<%= f.collection_radio_buttons :role_id, Role.all, :id, :name, include_hidden: false %>

Owner of this card:

Avatar
Alexander M
Last edit:
over 5 years ago
by Alexander M
Tags:
Rails-5-0
Posted by Alexander M to Ruby and RoR knowledge base
This website uses short-lived cookies to improve usability.
Accept or learn more