Rails - 不允许的嵌套 children 参数
Rails - Unpermitted nested children parameters
parent 已保存,但 children 未保存。如果我添加 landslide.sources.create
,它会在 sources
table 中创建一行,其中包含正确的 landslide_id
,但所有其他列均为空。这是文件:
landslide_controller.rb
def new
@landslide = Landslide.new
@landslide.sources.build
end
def create
landslide = Landslide.new(landslide_params)
landslide.save
end
def landslide_params
params.require(:landslide).permit(:start_date, :continent, :country, :location, :landslide_type, :lat, :lng, :mapped, :trigger, :spatial_area, :fatalities, :injuries, :notes, source_attributes: [ :url, :text ])
end
sources_controller.rb
def new
source = Source.new
end
def create
source = Source.new(source_params)
source.save
end
def source_params
params.require(:source).permit(:url, :text)
end
_form.html.haml
= form_for :landslide, :url => {:controller => 'landslides', :action => 'create'} do |f|
.form-inputs
%form#landslideForm
#Fields
%fieldset
%legend Source
= f.fields_for :sources do |s|
.form-group.row
= s.label :url, class: 'col-sm-2 col-form-label'
.col-sm-10
= s.text_field :url, class: "form-control"
.form-group.row
= s.label :text, class: 'col-sm-2 col-form-label'
.col-sm-10
= s.text_field :text, class: "form-control"
.form-actions
= f.button :submit, class: "btn btn-lg btn-primary col-sm-offset-5", id: "submitButton"
landslide.rb 和 source.rb
class Source < ApplicationRecord
belongs_to :landslide, inverse_of: :sources
end
class Landslide < ApplicationRecord
has_many :sources, dependent: :destroy, inverse_of: :landslide
accepts_nested_attributes_for :sources
** routes.rb **
resources :landslides do
resources :sources
end
根据您的代码,预计会创建 source
空字段。由于 landslide.sources.create
此处您创建的 source
没有任何属性值。
要成功保存 source
请执行以下步骤。
- 在控制器的新方法上构建
source
def new
@landslide = Landslide.new
@landslide.sources.build
end
用户 @landslide
(在 new
上声明)
= form_for @landslide
和其他东西将保持不变。
从您的 landslide_controller.rb
中删除 landslide.sources.create
因为 source
会在保存 landslide
后自动保存。
希望以上更改能解决您的问题。
parent 已保存,但 children 未保存。如果我添加 landslide.sources.create
,它会在 sources
table 中创建一行,其中包含正确的 landslide_id
,但所有其他列均为空。这是文件:
landslide_controller.rb
def new
@landslide = Landslide.new
@landslide.sources.build
end
def create
landslide = Landslide.new(landslide_params)
landslide.save
end
def landslide_params
params.require(:landslide).permit(:start_date, :continent, :country, :location, :landslide_type, :lat, :lng, :mapped, :trigger, :spatial_area, :fatalities, :injuries, :notes, source_attributes: [ :url, :text ])
end
sources_controller.rb
def new
source = Source.new
end
def create
source = Source.new(source_params)
source.save
end
def source_params
params.require(:source).permit(:url, :text)
end
_form.html.haml
= form_for :landslide, :url => {:controller => 'landslides', :action => 'create'} do |f|
.form-inputs
%form#landslideForm
#Fields
%fieldset
%legend Source
= f.fields_for :sources do |s|
.form-group.row
= s.label :url, class: 'col-sm-2 col-form-label'
.col-sm-10
= s.text_field :url, class: "form-control"
.form-group.row
= s.label :text, class: 'col-sm-2 col-form-label'
.col-sm-10
= s.text_field :text, class: "form-control"
.form-actions
= f.button :submit, class: "btn btn-lg btn-primary col-sm-offset-5", id: "submitButton"
landslide.rb 和 source.rb
class Source < ApplicationRecord
belongs_to :landslide, inverse_of: :sources
end
class Landslide < ApplicationRecord
has_many :sources, dependent: :destroy, inverse_of: :landslide
accepts_nested_attributes_for :sources
** routes.rb **
resources :landslides do
resources :sources
end
根据您的代码,预计会创建 source
空字段。由于 landslide.sources.create
此处您创建的 source
没有任何属性值。
要成功保存 source
请执行以下步骤。
- 在控制器的新方法上构建
source
def new @landslide = Landslide.new @landslide.sources.build end
用户
@landslide
(在new
上声明)= form_for @landslide
和其他东西将保持不变。从您的
landslide_controller.rb
中删除landslide.sources.create
因为source
会在保存landslide
后自动保存。
希望以上更改能解决您的问题。