【发布时间】:2017-01-24 19:53:09
【问题描述】:
前几天我生成了一个新的 rails 5 --api --database=postgresql 应用程序,并且只创建了一个脚手架(Hero)。当我看到一些奇怪的行为时,我想知道强参数如何在 Rails 中工作:
控制器看起来像:
def create
hero = Hero.new(hero_params)
if hero.save
render json: hero, status: :created, location: hero
else
render json: hero.errors, status: :unprocessable_entity
end
end
我的 hero_params 如下所示:
def hero_params
params.require(:hero).permit(:name)
end
所以我假设客户端需要提交一个包含 "hero" 键的哈希,并且允许有一个 "name" 子键,当调用此控制器操作时允许批量分配。
意思是,JSON 应该是这样的:
{
"hero": {
"name": "test"
}
}
一切都很好,但在这里我看到了奇怪的行为。当用户如上提交准确的 JSON 时,参数如下:
Parameters: {"hero"=>{"name"=>"test"}}
现在如果用户只提交:
{ "name": "test" }
它仍然创建一个新资源,参数如下:
Parameters: {"name"=>"test", "hero"=>{"name"=>"test"}}
为什么会有两组参数,一组是实际提交的数据,另一组是英雄对象的格式,好像在期待批量分配?
为什么
require(:hero)在未提交该密钥时不会引发错误?我认为这个问题的答案是因为自动创建第二个哈希(问题 1 中的"hero"=>{"name"=>"test"}}。
任何关于我在这里遗漏的信息将不胜感激,因为这是开箱即用的准系统 Rails 行为。
【问题讨论】:
-
看起来用户提交了两种参数格式,例如
{name: "test", hero: {name: "test"}}。这可能吗? -
不,我是用户,我通过 POSTMAN 发送我的请求,两个示例都是单独发送的。
标签: ruby-on-rails json ruby ruby-on-rails-5 strong-parameters