如何在Rails 4中清晰地更新HABTM关联列表?

8
我将尝试使用“多对多关联”连接方式,更新一个包含相关“地址”的“用户”记录。下面是我通过javascript发送的请求内容:
{"id":10,"name":"John Smith", "address_ids":[4,8]}

这是我在Rails服务器日志中看到的内容:
``` Started PUT "/api/users/10" for 127.0.0.1 at 2013-10-03 16:30:43 +0200 Processing by Api::UsersController#update as HTML Parameters: {"id"=>"10", "name"=>"John Smith", "address_ids"=>[4, 8], "user"=>{"id"=>"10", "name"=>"John Smith"}} ```
需要注意的是,上面的日志显示`address_ids`数组未能成功添加到`user`哈希表中。
在控制器中,我使用了强参数并像这样更新了User
attributes = params.require(:user).permit(:id, :name, {:address_ids => []}) 
@user.update_attributes(attributes)

问题在于更新时属性不包含地址ID,因此关联记录未得到更新。
临时解决方案:
我手动解决了这个问题,将地址ID键分配给属性,就像这样:
```ruby attributes[:address_ids] = params[:model][:address_ids] ```
attributes = params.require(:user).permit(:id, :name, {:address_ids => []})
if params.has_key?(:address_ids)   
  attributes[:address_ids] = params[:address_ids] 
end
@user.update_attributes(attributes)

这个代码可以正常工作,但我感觉它并不是应该这样工作的? 为什么adderss_ids没有自动分配?如何以清晰的方式实现它?
1个回答

9
如果您希望将地址保存在用户信息中,需要确保客户端代码按照以下方式发送address_ids参数:
Parameters: {"user"=>{"id"=>"10", "name"=>"John Smith", "address_ids"=>["4", "8"]}}

输入框的name属性将会是这样的:
<input name="user[address_ids][]">

我注意到你的用户属性在参数中重复出现了,因此你可能需要仔细检查客户端代码如何生成请求。

谢谢。总之,解决方案是确保从JavaScript发送的对象具有资源名称作为根键。仍然不清楚为什么有些字段即使没有它也会被正确赋值,而有些则不会... - mrt
有没有办法通过传递“地址”UUID而不是暴露顺序ID来完成这个? - johnsorrentino
@John。出于许多原因,我绝对支持使用UUIDs,但在这种情况下,无论 IDs 是否为 UUIDs 或连续整数,都不会影响此处的方法。无论是什么 ID,它们都来自数据库,而不管使用何种 ID 方案。 - Andrew Hacking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接