Search code examples
ruby-on-railsdeviseassociationssimple-form

Rails not saving checkbox input from model with many-to-many association


I have two models Teacher and Student, and I established a HABTM relationship between two of them. I have a form for each of them to create a new record in the database. For example, in the create teacher form, the user can enter the teacher's name as input, and tick checkboxes containing the names of different students. If the user ticks a box, the input will not be saved, but if the checkbox is left blank and the user simply inputs the name, a new record is saved. Weirdly enough, if the user updates the teacher, that's only time the user can choose students to include in the teacher's record.

This is how some of the methods in TeacherController looks like:

def new
  @teacher = current_user.teachers.build
end

def create
  @teacher = current_user.teachers.build(teacher_params)

  if @teacher.save
    redirect_to root_path
  else
    render 'new'
  end
end

def edit
end

def update
  if @teacher.update(teacher_params)
    redirect_to teacher_path(@teacher)
  else
    render 'edit'
  end
end

private
  def teacher_params
    params.require(:teacher).permit(:name, :student_ids => [])
  end

  def search_teacher
    @teacher = Teacher.find(params[:id])
  end

Below is the form I use to create a new teacher and update an existing teacher:

<%= simple_form_for @teacher do |f| %>
  <%= f.input :name, label: "Teacher's Name" %>
  <label>Students</label>
  <br>
  <%= f.collection_check_boxes :student_ids, Student.all, :id, :name %>
  <br>
  <%= f.button :submit %>
<% end %>

It might also help noting that I only encountered this problem after introducing user authentication with devise in my application.


Solution

  • Follow steps like this

    in the controller

    def create
       @teacher = Teacher.new(teacher_params)
       @teacher.user= current_user
       if @teacher.save
         # code
       else
         # code
       end
    end
    
    private
    def teacher_params
       params.require(:teacher).permit(:name, student_ids: [])
    end
    

    The form

    <%= f.collection_check_boxes :student_ids, Student.all, :id, :name do |cb| %>
        <% cb.label(class: "checkbox-inline input_checkbox") {cb.check_box(class: "checkbox") + cb.text } %>
    <% end %>
    

    See the collection_check_boxes and this relationship.

    If don't work it would be better to post Models with relationships.