簡體   English   中英

Rails _destroy 字段在表單中出現兩次

[英]Rails _destroy field appearing twice in form

我有兩個模型,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

根據railscast 196定義用於銷毀 plot 的復選框的部分 _editplot:

= 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)

我已經在預設 controller 中允許了 _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 開發工具檢查頁面時,它顯示在復選框旁邊還有一個隱藏字段<input name="preset[plots_attributes][0][_destroy]" type="hidden" value="0"> _destroy 值 0 也是在提交表單時傳遞的。 我有一種感覺,這個元素正在干擾表單,但我不確定它來自哪里或如何擺脫它。

我沒有在這里包含它,但我有一些相同形式的 JS 代碼,它們添加和刪除“新繪圖”部分,這些代碼生成自己的 _destroy 字段。 我不認為它們會成為問題的原因,但如有必要,我可以在編輯中添加此代碼。

這是默認的 Rails 行為,如復選框文檔頁面中所述。

正如 zwippie 所指出的,問題不在於復選框,而在於我的 controller。 我試圖在 controller 中手動更新預設和繪圖的屬性(即使用像@plot.update(name: plot_name, parameter_path: _parameter_path)的行)。 因為我是手動執行此操作,所以我實際上並沒有處理 _destroy 參數,因此一旦從表單中傳遞了它,rails 就沒有對它做任何事情。

為了解決這個問題,我改用@preset.update(preset_params) ,其中preset_params表示controller 中允許的參數。 只要允許 _destroy,它就會刪除 object。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM