Rails 5: вложенные атрибуты не обновляются для модели - PullRequest
0 голосов
/ 26 марта 2019

Я не могу получить рельсы для обновления моих вложенных атрибутов, хотя обычные атрибуты работают нормально.Это моя структура:

unit.rb:

class Unit < ApplicationRecord
  has_many :unit_skill_lists
  has_many :skill_lists, through: :unit_skill_lists, inverse_of: :units, autosave: true

  accepts_nested_attributes_for :skill_lists, reject_if: :all_blank, allow_destroy: true
end

unit_skill_list.rb:

class UnitSkillList < ApplicationRecord
  belongs_to :unit
  belongs_to :skill_list
end

skill_list.rb:

class SkillList < ApplicationRecord
  has_many :unit_skill_lists
  has_many :units, through: :unit_skill_lists, inverse_of: :skill_lists
end

И это (часть) контроллера:

class UnitsController < ApplicationController
  def update
    @unit = Unit.find(params[:id])

    if @unit.update(unit_params)
      redirect_to edit_unit_path(@unit), notice: "Unit updated"
    else
      redirect_to edit_unit_path(@unit), alert: "Unit update failed"
    end
  end

  private
    def unit_params
      unit_params = params.require(:unit).permit(
          ...
          skill_list_attributes: [:id, :name, :_destroy]
      )
      unit_params
    end
end

Соответствующие строки в форме (используя formtastic и кокон):

<%= label_tag :skill_lists %>
<%= f.input :skill_lists, :as => :check_boxes, collection: SkillList.where(skill_list_type: :base), class: "inline" %>

Есть идеи, где я иду не так?Я пытался следовать всем руководствам, которые мог найти, но обновление ничего не делает для вложенных атрибутов.

Редактировать после справки от Василисы:
Это ошибка, когда я пытаюсь обновить модуль:

ActiveRecord::RecordInvalid (Validation failed: Database must exist):

Это полный unit_skill_list.rb:

class UnitSkillList < ApplicationRecord
  belongs_to :unit
  belongs_to :skill_list
  belongs_to :database
end

Нет поля ввода для "базы данных".Предполагается, что он устанавливается из переменной сеанса при обновлении модуля.

1 Ответ

2 голосов
/ 27 марта 2019

Если вы посмотрите журнал сервера, вы увидите что-то вроде skill_list_ids: [] в хэше params. Вам не нужно accepts_nested_attributes_for :skill_lists, так как вы не создаете новый SkillList при создании / обновлении модуля. Измените разрешенные параметры на:

def unit_params
  params.require(:unit).permit(
      ...
      skill_list_ids: []
  )
end

UPDATE

Я думаю, что лучшим вариантом здесь является установка параметра optional - belongs_to :database, optional: true. И обновить его в контроллере вручную.

def update
  @unit = Unit.find(params[:id])
  if @unit.update(unit_params)
    @unit.skill_lists.update_all(database: session[:database])
    redirect_to edit_unit_path(@unit), notice: "Unit updated"
  else
    redirect_to edit_unit_path(@unit), alert: "Unit update failed"
  end
end
...