如何在Rails

时间:2015-09-09 05:23:43

标签: ruby-on-rails ruby json params

我的控制器方法适用于我的ERB表单,但不接受数组作为JSON参数。我有一组名为" style_ids"从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}

我已经阅读了很多关于此的文档,感觉我正在以正确的方式做到这一点......希望我能错过一些东西。谢谢!

1 个答案:

答案 0 :(得分:2)

我终于弄明白了。 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