Ruby on rails 如何在Rails 4中干净地更新HABTM关联列表?
我正在尝试用关联的Ruby on rails 如何在Rails 4中干净地更新HABTM关联列表?,ruby-on-rails,ruby-on-rails-4,has-and-belongs-to-many,strong-parameters,Ruby On Rails,Ruby On Rails 4,Has And Belongs To Many,Strong Parameters,我正在尝试用关联的地址列表更新用户记录,这些地址通过连接,并且属于许多关联 我通过javascript发送的请求正文是: {"id":10,"name":"John Smith", "address_ids":[4,8]} 这是我在Rails服务器日志中得到的: 于2013-10-03 16:30:43+0200开始将“/api/users/10”用于127.0.0.1 通过Api进行处理::UsersController#更新为HTML 参数: {“id”=>“10”,“name”=>“Jo
地址列表更新用户记录,这些地址通过连接,并且属于许多关联
我通过javascript发送的请求正文是:
{"id":10,"name":"John Smith", "address_ids":[4,8]}
这是我在Rails服务器日志中得到的:
于2013-10-03 16:30:43+0200开始将“/api/users/10”用于127.0.0.1
通过Api进行处理::UsersController#更新为HTML
参数:
{“id”=>“10”,“name”=>“John Smith”,“address_id”=>[4,8],
“用户”=>{“id”=>“10”,“姓名”=>“约翰·史密斯”}
上面需要注意的是,根据日志,地址\u id
数组没有进入用户
散列
在控制器中我正在使用strong参数并更新用户
,如下所示:
attributes = params.require(:user).permit(:id, :name, {:address_ids => []})
@user.update_attributes(attributes)
问题是属性在更新时不包含地址ID,因此关联的记录不会得到更新
临时解决办法
我已经解决了在属性从强参数检查返回后手动将地址\u id
键分配给属性的问题,如下所示:
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)
这很好,但在我看来,这就是它应该如何工作的?
为什么没有自动分配附加ID
?如何以清晰的方式实现这一点?如果希望与用户一起保存地址,则需要确保客户端代码按如下方式发送地址\u id
参数:
Parameters: {"user"=>{"id"=>"10", "name"=>"John Smith", "address_ids"=>["4", "8"]}}
输入字段name
属性类似于:
<input name="user[address_ids][]">
我还注意到,您的参数中似乎重复了您的用户属性,因此您可能需要仔细检查客户端代码是如何生成请求的。谢谢。总之,解决方案是确保从javascript发送的对象具有带有资源名称的根键。仍然不清楚为什么有些字段在没有它的情况下被正确分配,而有些字段没有…有没有办法通过传递地址uuid而不是公开顺序id来实现这一点?@John。出于很多原因,我绝对支持UUID,但在这种情况下,ID是UUID还是顺序整数对这里的方法没有影响。不管传递的是什么ID,它们都来自数据库,而不管使用的是什么ID方案。