Сопоставление выходных данных collection_select с сильными параметрами

В консоли рельсов и используя модели ниже, я подключил оценки K, 1, а также 2 в школу, форма редактирования которой имеет это поле выбора:

Как видите, эта ассоциация правильно выбирает 3 элемента в поле, но если я нажму, чтобы выбрать / отменить выбор, эти изменения не будут сохранены.

Вот модели:

# app/models/school.rb
class School < ActiveRecord::Base
  has_many :grades_schools, inverse_of: :school
  has_many :grades, through: :grades_schools
  accepts_nested_attributes_for :grades_schools, allow_destroy: true
end

# app/models/grades_school.rb
class GradesSchool < ActiveRecord::Base
  belongs_to :school
  belongs_to :grade
end

# app/models/grade.rb
class Grade < ActiveRecord::Base
  has_many :grades_schools, inverse_of: :grade
  has_many :schools, through: :grades_schools
end

Форма выглядит так:

# app/views/schools/_form.html.haml
= form_for(@school) do |f|
  / <snip> other fields
  = collection_select(:school, :grade_ids, @all_grades, :id, :name, {:selected => @school.grade_ids, include_hidden: false}, {:multiple => true})
  / <snip> other fields + submit button

И контроллер выглядит так:

# app/controllers/schools_controller.rb
class SchoolsController < ApplicationController
  before_action :set_school, only: [:show, :edit, :update]

  def index
    @schools = School.all
  end

  def show
  end

  def new
    @school = School.new
    @all_grades = Grade.all
    @grades_schools = @school.grades_schools.build
  end

  def edit
    @all_grades = Grade.all
    @grades_schools = @school.grades_schools.build
  end

  def create
    @school = School.new(school_params)

    respond_to do |format|
      if @school.save
        format.html { redirect_to @school, notice: 'School was successfully created.' }
        format.json { render :show, status: :created, location: @school }
      else
        format.html { render :new }
        format.json { render json: @school.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @school.update(school_params)
        format.html { redirect_to @school, notice: 'School was successfully updated.' }
        format.json { render :show, status: :ok, location: @school }
      else
        format.html { render :edit }
        format.json { render json: @school.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    def set_school
      @school = School.find(params[:id])
    end

    def school_params
      params.require(:school).permit(:name, :date, :school_id, grades_attributes: [:id])
    end
end

У меня есть ощущение, что суть моей проблемы связана с несоответствием между параметрами, генерируемыми collection_select и сильные параметры. Один или оба из них, вероятно, неверны, но я не могу найти пример кода в Интернете, который показывает мне, что я делаю неправильно.

Попробовав множество неудачных вариантов, я нахожусь в тупике! Заранее спасибо за помощь!

1 ответ

Решение

Дерьмо. Я мог бы поклясться, что попробовал это раньше, но это должно было быть при использовании fields_for в форме вместо collection_select, Решение:

def school_params
  params.require(:school).permit(:name, :date, :school_id, grades_attributes: [:id])
end

становится

def school_params
  params.require(:school).permit(:name, :date, :school_id, grade_ids: [])
end

Мне все еще интересно, как это будет работать при использовании fields_for @grades_schools, но придется сохранить это расследование еще на один день....