Rails _destroy поле появляется дважды в форме - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть две модели, Preset и Plot, как показано ниже:

class Preset < ApplicationRecord
    belongs_to :user
    has_many :plots, :dependent => :destroy
    accepts_nested_attributes_for :plots, allow_destroy: true
end

class Plot < ApplicationRecord
    belongs_to :preset
    belongs_to :theme, optional: true
end

И вложенная форма для редактирования пресетов:

= form_with(model: @preset, local: true, method: "patch") do |f|
  = label_tag(:preset_name, "Preset name:")
  = text_field_tag(:preset_name, @preset.name)
  %br
  = f.fields_for :plots do |builder|
    %br
    = render 'editplot', f: builder
  %br

Частичный _editplot, который определяет флажок для уничтожения график, согласно railscast 196 :

= f.label(:name, "Change plot:")
= f.select(:name, options_for_select([['Existing Plot 1', 'Existing Plot 1'], ['Existing Plot 2', 'Existing Plot 2']]))
= f.label(:_destroy, "Remove plot")
= f.check_box(:_destroy)

Я позволил параметру _destroy в контроллере пресетов

def preset_params
            params.require(:preset).permit(:name, plots_attributes: [:id, :name, :parameter_path, :theme_id, :_destroy])
        end

Все остальные аспекты редактирования пресетов работают хорошо, но флажок для _destroy нет. Параметры для уничтожения одного из двух графиков на экране редактирования отображаются в консоли следующим образом:

Parameters: {"authenticity_token"=>"TOKEN", "preset_name"=>"Preset", "preset"=>{"plots_attributes"=>{"0"=>{"name"=>"Existing Plot 1", "_destroy"=>"1", "id"=>"16"}, "1"=>{"name"=>"Existing Plot 1", "_destroy"=>"0", "id"=>"17"}}}, "commit"=>"Update Preset", "id"=>"25"}

Наличие «_destroy» => «1» предполагает, что это работает как задумано. Тем не менее, при проверке страницы с помощью инструментов Chrome Dev он также обнаруживает скрытое поле <input name="preset[plots_attributes][0][_destroy]" type="hidden" value="0"> рядом с флажком, значение _destroy которого 0 также передается при отправке формы. У меня такое ощущение, что этот элемент мешает форме, но я не уверен, откуда она взялась или как от нее избавиться.

Я не включил ее сюда, но у меня есть некоторые JS код в той же форме, который добавляет и удаляет частички «нового графика», и они генерируют свои собственные поля _destroy. Я не думал, что они будут причиной проблемы, но я могу добавить этот код в редактирование при необходимости.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Проблема была не с флажком, как указывает zwipp ie, а с моим контроллером. Я пытался обновить атрибуты предустановки и графики вручную в контроллере (то есть, используя такие строки, как @plot.update(name: plot_name, parameter_path: _parameter_path)). Поскольку я делал это вручную, я фактически не обрабатывал параметр _destroy, и поэтому rails ничего не делал с ним, как только он был передан из формы.

Чтобы исправить это, я использовал @preset.update(preset_params) вместо этого, где preset_params представляет разрешенные параметры в контроллере. Пока _destroy разрешен, он удаляет объект.

def preset_params
            params.require(:preset).permit(:name, plots_attributes: [:id, :name, :parameter_path, :theme_id, :_destroy])
        end
0 голосов
/ 06 апреля 2020

Это поведение Rails по умолчанию, как описано на странице документации флажка .

...