Tom Hammond
Tom Hammond

Reputation: 6090

Rails form_for check_box

I'm trying to create a basic survey app. On my take survey page I'm looping through and displaying each answer option as a radio button or checkbox as a form_for to create a user's choice. The choices are working great for the questions that are single choice (or radio buttons), but they aren't saving for multi select questions. I'm pretty sure this has to do with the form I have for the checkbox.

It seems like I should do

<%= f.check_box :answer_id, answer.id %> <%= answer.title %> <br>

similar to how I'm creating the radio button but that throws an error

undefined method `merge' for 14:Fixnum

Here's my code that displays:

<h3>Questions:</h3>
<ul><% @survey.questions.each do |question| %>
    <li><p><%= question.title %></p></li>
    <% choice = question.choices.build %>
    <% if question.single_response == true %>
    <%= form_for [question, choice] do |f| %>

            <% question.answers.each do |answer| %>
            <%= f.radio_button :answer_id, answer.id %> <%= answer.title %><br>
            <% end %>
            <%= f.hidden_field :survey_id, value: @survey.id %>
            <%= f.submit %>
            <% end %>

            <br />
            <% else %>
                <%= form_for [question, choice] do |f| %>
                    <% question.answers.each do |answer| %>
                    <%= f.check_box :answer_id %> <%= answer.title %> <br>
                    <%= f.hidden_field :survey_id, value: @survey.id %>
                    <% end %>
                    <%= f.submit %>
            <% end %>
            <br />
        <% end %>
<% end %>
</ul>

Any idea what I need to do to get it to save the answer_id to the choice so that it actually creates the choice?

Thanks!

Upvotes: 1

Views: 4533

Answers (2)

Tovi Newman
Tovi Newman

Reputation: 715

This question is a few years old but I think it deserves a better answer. Since you are using form_for (a model backed form), then you probably want to use the form_for check_box method that you originally tried to use. In your case, it would look like this:

<%= f.check_box :choice, { :multiple => true }, answer.id, false %>

Here is the doc on this.

Upvotes: 4

Carlos Ramirez III
Carlos Ramirez III

Reputation: 7434

For checkboxes, you actually want to return an array as the parameter. There is a little funny syntax to this because we don't actually want to use the form builder methods. It should look something like this (adapt to your specific model names and methods)

<%= check_box_tag 'choice[answer_ids][]', answer.id %>

Using this syntax should tell Rails to compile all of the checked checkbox values into an array.

This Railscast goes over the topic.

Upvotes: 2

Related Questions