Search code examples
ruby-on-railsnested-formsnested-attributesstrong-parameters

Nested forms and strong parameters - rails 4


I have a problem with a form and strong parameters. I see many have gone before me with such problems but nothing suggested to them seems to work.

My form:

<%= form_for(@student) do |f| %>
    <%= f.label :school_id %>
    <%= f.text_field :school_id, class: 'form-control' %>
    ...
    <%= f.fields_for :enrollments do |enrol_form| %>
       <%= enrol_form.label :date , "Enrollment date", class: 'form-control' %>
       <%= enrol_form.date_field :date , class: 'form-control' %>
       <%= enrol_form.hidden_field :reason, value: "Entered on system" %>
    <% end %>
    ...
<% end %>

Models:

class Student < ActiveRecord::Base
   include PhoneValid
   has_many :enrollments, inverse_of: :student
   validates :enrollments, :presence  => { message: "Must have at least one enrollment event" } 
   accepts_nested_attributes_for :enrollments
end

class Enrollment < ActiveRecord::Base
  belongs_to :student
  default_scope -> { order(date: :asc) }
  validates :date, presence:true
  validates :enroll_wd, inclusion: {in: %w(ENROLL WD), messages: "%{value} must be either WD or ENROLL"}
end

Controller:

class StudentsController < ApplicationController
  def create     
    @student = Student.new(student_params)
    @student.save 
  end

  def student_params
    params.require(:student).permit(:school_id, :cellphone, :attendance_officer_id, :attendance_officer_type, :language_preferred, {enrollment_attributes: [:date, :reason, :id]})
  end
end

The output of my form according to debug(params) is:

--- !ruby/hash:ActionController::Parameters  
utf8: "✓"  
authenticity_token:   >cuk8Y+d8fHhJ3mU7wtRYtyDJoiYaG8lfzHvdGVBUI+1qmH7xQr20BHsBAFRT4r1EfDb/MMbxMq8rbKw3Cf2Y1A==  
student: !ruby/hash:ActionController::Parameters  
  school_id: '234234'  
  cellphone: '234234234'  
  language_preferred: en  
  enrollments_attributes: !ruby/hash:ActionController::Parameters  
     '0': !ruby/hash:ActionController::Parameters  
       date: '2015-07-10'  
       reason: Entered on system  
  attendance_officer_id: '8'  
  attendance_officer_type: User  
commit: Save student  
controller: students  
action: create  

The output of student_params is:

{"school_id"=>"234234", "cellphone"=>"234234234", "attendance_officer_id"=>"8", "attendance_officer_type"=>"User", "language_preferred"=>"

I've been trying every different format of student_params that I can find on in the forums and have concluded that the problem must be somewhere else - am I creating the form correctly? Is there something wrong in my models?

Thank you for any help you can give me.

Walter


Solution

  • Try changing your student_params to below

    def student_params
      params.require(:student).permit(:school_id, :cellphone, :attendance_officer_id, :attendance_officer_type, :language_preferred, enrollments_attributes: [:date, :reason, :id])
    end