【发布时间】: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