May 18, 2016
This blog is part of our Rails 5 series.
Consider the following form which has only one input role_id
which is accepted
through collection_radio_button
.
<%= 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.
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.
ActionController::ParameterMissing (param is missing or the value is empty: user):.
This is because following parameters were sent to server in Rails 4.x .
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.
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:
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
.
<%= f.collection_radio_buttons :role_id, Role.all, :id, :name, include_hidden: false %>
If this blog was helpful, check out our full blog archive.