Rails5,嵌套形式的不允许参数,同时关联现有对象
Rails5, unpermitted params in nested form, while associating existing objects
为什么为什么为什么...?
三个模型(FirstModel、SecondModel、JoinedModel),JoinedModel属于另外两个模型通过 JoinedModel 和其他两个 has_many
。
JoinedModel accepts_nested_attributes_for
first_model 和 second_model.
它还验证 first_model_id
和 second_model_id
的存在。
加入模型强参数:
private
def joined_params
params.require(:joined_model).permit(:first_model_id, :second_model_id,
:first_models_attributes => [:id, :name],
:second_models_attributes => [:id, :full_name])
end
JoinedModel 的 _form:
<%= form_for(joined_model) do |f| %>
<%= f.fields_for :second_models do |ff| %>
<%= ff.select(SecondModel.all.map {|c| [ c.full_name, c.id ] }, { include_blank: true }) -%>
(FirstModel 也是 f.fields_for
)
当我提交此表单时,我得到
Unpermitted params first_models, second_models
并查询:
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"gvW/OrOXJruAK0ZD+uoajJ4N+dZvpmZF8Ay0TOKF9HPO19d4tRBoWz0C4VoaOABYat8KzrryL8lp5ax+Y9ZJRg==",
"joined_model"=>{"first_models"=>{"first_model_id"=>"1"},
"second_models"=>{"second_model_id"=>"1"}}, "commit"=>"Create Joined
model"}
我不知道为什么、如何等等。表单尝试发送散列 - "second_models"=>{"second_model_id"=>"1"}
它应该就像 "second_model_id"=>"1"
如果我的表单使用简单 f.number_field :first_model_id
而不是 select
...
我找到了答案并将留下这个 post,因为在 Whosebug 上发现了许多类似的未回答问题
所以,答案是使用 parent 的 select
字段生成器,例如:
<%= form_for(joined_model) do |f| %>
<%= f.fields_for :second_models do |ff| %>
<%= f.select(SecondModel.all.map {|c| [ c.full_name, c.id ] }, { include_blank: true }) -%>
看起来现在一切正常,但是如果有人知道为什么我什至不使用它甚至需要为嵌套字段提供构建器 object(在我的例子中是 |ff|
),我会跳嗨五和探戈舞!
更新:
所以我发现在这种情况下我什至不需要fields_for
...现在一切都说得通了,因为在这里我创建了一个新的 JoinedModel 的记录并且只选择 其他两个(现有的)记录和关联只是让我掌握那些方法……有点蹩脚,但是哦,好吧……
为什么为什么为什么...?
三个模型(FirstModel、SecondModel、JoinedModel),JoinedModel属于另外两个模型通过 JoinedModel 和其他两个 has_many
。
JoinedModel accepts_nested_attributes_for
first_model 和 second_model.
它还验证 first_model_id
和 second_model_id
的存在。
加入模型强参数:
private
def joined_params
params.require(:joined_model).permit(:first_model_id, :second_model_id,
:first_models_attributes => [:id, :name],
:second_models_attributes => [:id, :full_name])
end
JoinedModel 的 _form:
<%= form_for(joined_model) do |f| %>
<%= f.fields_for :second_models do |ff| %>
<%= ff.select(SecondModel.all.map {|c| [ c.full_name, c.id ] }, { include_blank: true }) -%>
(FirstModel 也是 f.fields_for
)
当我提交此表单时,我得到
Unpermitted params first_models, second_models
并查询:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"gvW/OrOXJruAK0ZD+uoajJ4N+dZvpmZF8Ay0TOKF9HPO19d4tRBoWz0C4VoaOABYat8KzrryL8lp5ax+Y9ZJRg==", "joined_model"=>{"first_models"=>{"first_model_id"=>"1"}, "second_models"=>{"second_model_id"=>"1"}}, "commit"=>"Create Joined model"}
我不知道为什么、如何等等。表单尝试发送散列 - "second_models"=>{"second_model_id"=>"1"}
它应该就像 "second_model_id"=>"1"
如果我的表单使用简单 f.number_field :first_model_id
而不是 select
...
我找到了答案并将留下这个 post,因为在 Whosebug 上发现了许多类似的未回答问题
所以,答案是使用 parent 的 select
字段生成器,例如:
<%= form_for(joined_model) do |f| %>
<%= f.fields_for :second_models do |ff| %>
<%= f.select(SecondModel.all.map {|c| [ c.full_name, c.id ] }, { include_blank: true }) -%>
看起来现在一切正常,但是如果有人知道为什么我什至不使用它甚至需要为嵌套字段提供构建器 object(在我的例子中是 |ff|
),我会跳嗨五和探戈舞!
更新:
所以我发现在这种情况下我什至不需要fields_for
...现在一切都说得通了,因为在这里我创建了一个新的 JoinedModel 的记录并且只选择 其他两个(现有的)记录和关联只是让我掌握那些方法……有点蹩脚,但是哦,好吧……