ruby-on-rails - Rails 5 inverse_of 连接表不想使用深度嵌套的 Cocoon 字段
问题描述
我正在使用Ruby 2.6.5
和Rails 5.2.3
。我有一个带有双嵌套对象的表单Cocoon。表格用于Preorders
. 一个Preorder
可以有很多Dancers
。Dancers
可以有很多,也可以属于很多Groups
,所以我建立了一个名为DancerGroup
.
我使用Cocoon添加dancers_attributes
到Preorder
表单中,然后再次添加dancer_groups_attributes
到dancers_attributes
字段内部。
我的问题是,当我尝试Preorder
使用新的Dancer
和新DancerGroup
的关联保存 a 时,我收到以下错误:
- 舞者 舞者组 舞者不能为空
这显然意味着它试图在记录有dancer_group
之前保存对象。显而易见的答案是,由于我使用的是 Rails 5,默认情况下需要关联,解决方法是正确使用和方法让 Rails 管理保存所有内容一次全部。但是当涉及到我的join table时,它不起作用。当我在模型中设置时,我什至得到了同样的错误。dancer
id
belongs_to
inverse_of
accepts_nested_attributes_for
optional: true
belongs_to :dancer
DancerGroup
我的强大参数如下所示:
private
def preorder_params
params.require(:preorder).permit( :event_id,
:dancers_attributes => [
:_destroy,
:id,
:name,
:dancer_groups_attributes => [
:_destroy,
:group_id,
:id ]
]
)
end
我的模型如下所示:
应用程序/模型/preorder.rb
class Preorder < ApplicationRecord
belongs_to :event
has_many :dancers, dependent: :destroy, inverse_of: :preorder
has_many :dancer_groups, through: :dancers, dependent: :destroy
with_options reject_if: :all_blank, allow_destroy: true do
accepts_nested_attributes_for :dancers
accepts_nested_attributes_for :dancer_groups
end
validates :dancers, :length => { minimum: 1 }
...
end
应用程序/模型/dancer.rb
class Dancer < ApplicationRecord
belongs_to :preorder, counter_cache: true, inverse_of: :dancers
has_many :dancer_groups, inverse_of: :dancer, dependent: :destroy
has_many :groups, through: dancer_groups
with_options reject_if: :all_blank, allow_destroy: true do
accepts_nested_attributes_for :dancer_groups
end
...
end
应用程序/模型/dancer_group.rb
class DancerGroup < ApplicationRecord
belongs_to :dancer, inverse_of :dancer_groups
belongs_to :group, inverse_of :dancer_groups
...
end
这是我的表单文件的样子
意见/管理/预购/_form.html.haml
...
%fieldset
%legend Dancers
#dancers
- @preorder.dancers.each do |dancer|
= f.fields_for :dancers, dancer do |ff|
= render "dancer_fields", f: ff, preorder: @preorder
= link_to_add_association f, :dancers,
{ "data-association-insertion-node": "#dancers",
"data-association-insertion-method": "append",
render_options: { locals: { preorder: @preorder } },
class: "btn btn-info btn-sm btn-simple float-right" } do
= icon "fas", "plus"
Add Dancer
...
意见/管理/预购/_dancer_fields.html.haml
...
.card.preorder_dancer
.card-header.row
.col
%h4.card-title Dancer Info
.col-auto
= link_to_remove_association f, { wrapper_class: "preorder_dancer",
class: "btn btn-sm btn-icon btn-simple btn-danger" } do
= icon "fas", "times"
.card-body
.row.pb-3
.col
= f.label :name do
Full Name
%span.text-danger *
= f.text-field :name, class: "form-control"
%h4.card-title Dance Groups
.row{ :id => "dancer_groups_#{f.object.id}" }
- f.object.dancer_groups.each do |dancer_group|
= f.fields_for :dancer_groups, dancer_group do |ff|
= render "dancer_group_fields, f: ff,
preorder: preorder
=link_to_add_association f, :dancer_groups,
{ "data-association-insertion-node": "#dancer_groups_#{f.object.id}",
"data-association-insertion-method": "append",
render_options: {locals: { preorder: preorder } },
class: "btn btn-info btn-sm btn-simple float-right" } do
=icon "fas", "plus"
Add Dance Group
意见/管理/预购/_dancer_group_fields.html.haml
.col-lg-6.preorder_dancer_group
.card.bg-dark
.card-header.row
.col
%h4.card-title Dance Group
.col.text-right
=link_to_remove_association f, { wrapper_class: "preorder_dancer_group",
class: "btn btn-sm btn-icon btn-simple btn-danger"} do
=icon "fas", "times"
.card-body
.row
.col
=f.label :group_id do
Group
%span.text-danger *
=f.collection_select :group_id,
preorder.event.groups,
:id,
:name,
{include_blank: "Select Group"},
{class: "form-control"}
解决方案
在你的_dancer_fields
部分你写
%h4.card-title Dance Groups
.row{ :id => "dancer_groups_#{f.object.id}" }
- f.object.dancer_groups.each do |dancer_group|
= f.fields_for :dancer_groups, dancer_group do |ff|
= render "dancer_group_fields, f: ff,
preorder: preorder
那应该是
%h4.card-title Dance Groups
.row{ :id => "dancer_groups_#{f.object.id}" }
= f.fields_for :dancer_groups do |ff|
= render "dancer_group_fields, f: ff,
preorder: preorder
因为否则你不会让舞者组“连接”到舞者。
推荐阅读
- vba - 允许在一个打开的工作簿中使用 UDF,但使其在另一个工作簿中不可见/不可用/不可访问
- python - 僵尸 zeppelin-spark 进程的来源是什么?
- linux - 如果不在同一目录中,则无法运行配置文件
- c - 从 word 文档中删除段落标签只会导致 microsoft word 损坏
- javascript - 用javascript代码块替换html块,在“文档”错误上执行“写入”失败
- python - Python。多处理池。如何获得所有结果
- android - 当应用程序安装在 SD 卡上而不是内部存储上时,DownloadManager 会广播 DownloadManager.ERROR_FILE_ERROR
- azure-devops - VSTS REST API 缓存
- javascript - 如果 React 组件的 props 更新但值没有改变,它会重新渲染吗?
- python - SQL 查询的值部分中的占位符错误