Search code examples
rubyruby-on-rails-4nested-formsnested-attributesnested-resources

Edit a Parent Class from a Child Form


Currently, I am able to create multiple Students through my Adult Form by using accepts_nested_attributes_for :student.

But how can I Edit an existing Adult through a Student Form? (So the Opposite, except Edit)

Currently I am able to create more Parents through my Student form, but thats not what I want.

MODELS

class Adult < ActiveRecord::Base  
  has_many :students
  accepts_nested_attributes_for :student
end


class Student < ActiveRecord::Base
  belongs_to :adult
  accepts_nested_attributes_for :adult
end

CONTROLLER

class StudentsController < ApplicationController

  def update
    @adult = Adult.find(params[:adult_id])
    @student = Student.find(params[:id])
    if @student.update_attributes(student_params)
      redirect_to path
    end
  end

    private

    def student_params
      params.require(:student).permit(:adult_id, :school_id, :username, :password, 
                                  :firstName, :middleName, :lastName, :alias,
                                  adult_attributes: [:id, :name])
    end 

end

VIEWS

###HOW CAN I UPDATE THE EXISTING PARENT AS OPPOSE TO CREATING ONE

<%= simple_form_for @student.build_adult do |f| %>
      <h4>Update Parent Information</h4>


      <%= f.label :firstName, 'First Name' %>
      <%= f.text_field :firstName, placeholder: "Parent's First Name", :class => "form-control"%>

      <%= f.submit "Save & Continue", class: "btn btn-primary"%>

<% end %>

ROUTES

resources :adult do
  resources :student
end

Solution

  • Firstly,it is has_many :students,so it should be accepts_nested_attributes_for :students not accepts_nested_attributes_for :student.

    Secondly,if i understood your question correctly,you are trying to update the existing parent(adult) record but you are ending up creating a new one.Is that the problem? If so,you need to permit the :id of the student for which the parent(adult) record need to be updated.

    Change your student_params method to like this

    def student_params
      params.require(:student).permit(:id,:adult_id, :school_id, :username, :password, 
      :firstName, :middleName, :lastName,:alias,adult_attributes: [:id, :name])
    end