【问题标题】:How to POST/PUT array param in Rails如何在 Rails 中 POST/PUT 数组参数
【发布时间】:2015-09-14 06:46:56
【问题描述】:

我的控制器方法非常适合我的 ERB 表单,但不接受数组作为 JSON 参数。我有一个名为“style_ids”的 id 数组,它从 JSON 中删除。

允许的参数:

params.require(:beer).permit(:name, :brewery_id, :style_ids => [])

当从 ERB 发布时,它看起来像这样:

all params: {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>”…”, "beer"=>{"name"=>"Amber", "style_ids"=>["", "1"], "brewery_id"=>"16"}, "commit"=>"Submit", "action"=>"update", "controller"=>"beers", "id"=>"213"}
permitted params: {"name"=>"Amber", "brewery_id"=>"16", "style_ids"=>["", "1"]}

当我通过 JSON 提交时,它看起来像这样:

params: {"id"=>"213", "name"=>"Amber", "style_ids"=>["1", "22"], "brewery_id"=>16, "action"=>"update", "controller"=>"beers", "beer"=>{"id"=>213, "name"=>"Amber", "brewery_id"=>16}}
Unpermitted parameters: id
permitted params: {"name"=>"Amber", "brewery_id"=>16}

我猜这与 Rails 在我的常规请求中在啤酒哈希中显示 style_ids 有关。我做错了什么导致它不会出现在我的 JSON 请求中? JSON 非常简单:{"id":213,"name":"Amber","style_ids":["1","22"],"brewery_id":16}

我已经阅读了很多关于此的文档,并且觉得我的做法是正确的……希望我只是遗漏了一些东西。谢谢!

【问题讨论】:

  • 嗨 Dennis,您的控制器允许参数操作在哪里?
  • 其实应该在beer里面。查看您在控制器上写的内容是params.require(:beer),这意味着参数哈希有一个名为beer 的键,并且允许的属性在其中。在您的JSON 请求中,您有:"beer"=>{"id"=>213, "name"=>"Amber", "brewery_id"=>16},其中不允许使用id,因此它显示Unpermitted parameters: id。其余的它不关心你发送什么。因为 Rails 将使用 beer 中的属性来创建/更新它。
  • 那么在使用 JSON 时,为什么啤酒哈希中没有 style_ids? Rails 会考虑该散列中的其他参数,但不考虑 style_ids。 @huanson,我不确定我是否遵循......整个许可参数都在一个函数中:def beer_params params.require(:beer).permit(:name, :brewery_id, :style_ids => []) end我从我的更新和创建函数中调用它。

标签: ruby-on-rails ruby json params


【解决方案1】:

我终于想通了。 Rails 使用wrap_parameters,所以我可以使用{“name": “name”} 而不是{“beer:{“name” : “name”}}。默认情况下,Rails 会包装您模型的 attribute_names 中的任何内容。

我的问题是 style_ids 是一个外部连接表 (has_and_belongs_to_many),所以它不在 attribute_names 中。我通过将其添加到控制器顶部来解决此问题:wrap_parameters :beer, include: [:style_ids, :name, :brewery_id]

最终让我通过这个链接:http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 2010-10-21
    • 2013-10-30
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多