ruby-on-rails - 如何干净地更新 Rails 4 中的 HABTM 关联列表?

标签 ruby-on-rails ruby-on-rails-4 has-and-belongs-to-many strong-parameters

我正在尝试更新 User记录关联列表 Addresses ,通过连接拥有并属于多个协会 .

我通过 发送的请求正文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根据日志散列。

Controller 我正在使用 强参数并更新 User像这样:
attributes = params.require(:user).permit(:id, :name, {:address_ids => []}) 
@user.update_attributes(attributes)

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

临时解决方案

我已经解决了手动分配 address_ids 的问题attributes 的 key 从强参数返回后,如下所示:
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没有得到自动分配?如何以明确的方式实现?

最佳答案

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

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

输入栏name属性将类似于:
<input name="user[address_ids][]">

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

关于ruby-on-rails - 如何干净地更新 Rails 4 中的 HABTM 关联列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19162830/

相关文章:

ruby-on-rails - 通过 Ruby 中的获取链接检查远程文件大小

ruby - 尝试生成一个随机字符串以作为 client_number 保存到 PG 表 Rails 4,PGSQL

ruby-on-rails - 更新 HABTM 模型关联只会删除关联

forms - Cakephp 2.3.1 HABTM 编辑表单显示下拉框而不是多选框

ruby-on-rails - Rails 测试 - 如何测试特定的验证?

ruby-on-rails - 在 Ruby 中扫描数组以查找字符串匹配项

ruby-on-rails - rake 数据库 :migrate - how do I know if there is an unrun migration

javascript - 如何在通过 'Best in place' 编辑进行内联编辑时删除 html 标签

ruby-on-rails - rails : Selecting unique label values with its ID

mysql - Ruby on Rails HABTM collection_select 数据库调用