我的控制器方法适用于我的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}
我已经阅读了很多关于此的文档,感觉我正在以正确的方式做到这一点......希望我能错过一些东西。谢谢!
答案 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