Rails 4.我有一个Authentication
模型
class Authentication < ActiveRecord::Base
...
has_and_belongs_to_many :posting_groups
...
end
和PostingGroup
型号
class PostingGroup < ActiveRecord::Base
...
has_and_belongs_to_many :authentications
...
end
联接表的迁移如下所示:
def change
create_table :authentications_posting_groups, id: false do |t|
t.belongs_to :posting_group
t.belongs_to :authentication
end
end
Authentication
和PostingGroup
表都不需要相互引用或引用连接表,因此其中没有相关信息。更新PostingGroups
的{{1}}时,请执行以下操作:
Authentication
在执行def update
@authentication.update_attributes(authentication_params)
end
def authentication_params
params.require(:other_unimportant_stuff, posting_groups: [])
end
操作期间,update
如下:
{&#34;身份验证&#34; =&gt; {&#34; posting_groups&#34; =&gt; [&#34; 17&#34;,&#34; 18&#34;]}, &#34;东西&#34; =&gt;&#34;更多东西}
...其中,17和18是应保存的发布组的ID。实际上,params
中的@authentication
变量包含所需的update
和PostingGroups
返回true。但是,update_attributes
(即实际存储在db中)返回一个空集。此外,检查Authentication.find(id).posting_groups
表显示以下内容:
authentications_posting_groups
由于一些奇怪的原因,posting_group_id authentication_id
17 NULL
18 NULL
永远不会进入数据库,这很有趣,因为首先在此对象上触发了保存。这不是我第一次遇到这个问题,而是第二次,我们第一次注意到一切正常(也就是说,那些authentication_id
没有在数据库中弹出)当< em>创建此方案中的内容是NULL
,但同样的情况发生在Authentication
上。在那个场合,实现了一个hack重新创建对象(在update
上一切正常!),但这里不是一个选项。我非常感谢任何指针,因为这让我们发疯。感谢。
编辑 - 这是触发整个事情的形式:
create
答案 0 :(得分:1)
您应该允许posts_group_ids并传递posting_group_ids
控制器
def update
@authentication.update_attributes(authentication_params)
end
def authentication_params
params.require(:other_unimportant_stuff, posting_group_ids: [])
end
查看
= form_for authentication, remote: true do |f|
= f.select :posting_group_ids, options_for_select(@posting_groups.map {|pg| [ pg.name, pg.id ] }), {}, multiple: true, class: "form-control posting_groups_select"
答案 1 :(得分:0)
params.require(:other_unimportant_stuff, posting_group_ids: [])
注意ids。
根据您的参数传递posting_group_ids
,但您的参数设置为posting_groups
,因此强参数会将其过滤掉。