Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails 4中干净地更新HABTM关联列表?_Ruby On Rails_Ruby On Rails 4_Has And Belongs To Many_Strong Parameters - Fatal编程技术网

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方案。