8

我正在尝试User使用关联列表更新记录Addresses,通过has 连接并属于许多关联

我通过javascript发送的请求正文是:

{"id":10,"name":"John Smith", "address_ids":[4,8]}

这是我在 Rails服务器日志中得到的:

在 2013-10-03 16:30:43 +0200 开始为 127.0.0.1 放置“/api/users/10”

由 Api::UsersController#update 处理为 HTML

参数:{"id"=>"10", "name"=>"John Smith", "address_ids"=>[4, 8], "user"=>{"id"=>"10", "name "=>"约翰·史密斯"}}

上面要注意的是数组没有根据日志address_ids进入散列。user

控制器中,我使用强参数并更新User如下:

attributes = params.require(:user).permit(:id, :name, {:address_ids => []}) 
@user.update_attributes(attributes)

问题是属性在更新时不包含 address_ids,因此相关记录没有得到更新。

临时解决方案

我已经解决了这个问题,在他们从强参数检查返回后手动分配address_ids密钥,如下所示:attributes

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没有自动分配?如何以明确的方式实施?

4

1 回答 1

9

如果您希望与用户一起保存地址,您需要确保您的客户端代码发送address_ids参数如下:

Parameters: {"user"=>{"id"=>"10", "name"=>"John Smith", "address_ids"=>["4", "8"]}}

输入字段name属性将类似于:

<input name="user[address_ids][]">

我还注意到您的参数中似乎重复了您的用户属性,因此您可能需要仔细查看您的客户端代码是如何生成请求的。

于 2013-10-04T12:53:41.600 回答