【问题标题】:Rails 5 API Strong Parameters behaviorRails 5 API 强参数行为
【发布时间】: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"}}
  1. 为什么会有两组参数,一组是实际提交的数据,另一组是英雄对象的格式,好像在期待批量分配?

  2. 为什么require(:hero) 在未提交该密钥时不会引发错误?我认为这个问题的答案是因为自动创建第二个哈希(问题 1 中的"hero"=>{"name"=>"test"}}

任何关于我在这里遗漏的信息将不胜感激,因为这是开箱即用的准系统 Rails 行为。

【问题讨论】:

  • 看起来用户提交了两种参数格式,例如{name: "test", hero: {name: "test"}}。这可能吗?
  • 不,我是用户,我通过 POSTMAN 发送我的请求,两个示例都是单独发送的。

标签: ruby-on-rails json ruby ruby-on-rails-5 strong-parameters


【解决方案1】:

此行为来自ActionController::ParamsWrapper

将参数散列包装成嵌套散列。这将允许客户端提交请求而无需指定任何根元素。

Rails 应用程序默认为 JSON 请求启用参数包装。您可以通过编辑 config/initializers/wrap_parameters.rb 来全局禁用它,或者通过在控制器中包含 wrap_parameters false 来为单个控制器禁用它。

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 2019-09-17
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多