热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Rails5API强参数行为-Rails5APIStrongParametersbehavior

Igeneratedanewrails5--api--databasepostgresqlapptheotherdayandonlycreatedonescaffol

I generated a new rails 5 --api --database=postgresql app the other day and only created one scaffold (Hero). I'm wondering how the strong parameters work in rails as I am seeing some odd behavior:

我前几天生成了一个新的rails 5 --api --database = postgresql app,只创建了一个脚手架(Hero)。我想知道强大的参数如何在rails中工作,因为我看到一些奇怪的行为:

Controller looks like:

控制器看起来像:

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

My hero_params look like this:

我的hero_params看起来像这样:

def hero_params
  params.require(:hero).permit(:name)
end

So I would assume that the client is required to submit a hash containing a "hero" key and it's allowed to have a "name" subkey that is allowed to be mass assigned when this controller action is called.

所以我假设客户端需要提交一个包含“英雄”键的哈希值,并允许它有一个“名称”子键,当调用此控制器操作时,该子键可以被批量分配。

Meaning, the JSON should look like this:

意思是,JSON应该如下所示:

{
  "hero": {
    "name": "test"
  }
}

All is well but here is where I am seeing strange behavior. When the user submits the exact JSON as above, the parameters come in as:

一切都很好,但这里是我看到奇怪的行为。当用户提交上面的确切JSON时,参数如下:

Parameters: {"hero"=>{"name"=>"test"}}

Now if the user submits just:

现在,如果用户只提交:

{ "name": "test" }

It still creates a new resource and the parameters come in as:

它仍然创建一个新资源,参数如下:

Parameters: {"name"=>"test", "hero"=>{"name"=>"test"}}
  1. Why are there two sets of parameters, one with the actual submitted data and one in the format of a hero object as if it was anticipating the mass assignment?

    为什么有两组参数,一组是实际提交的数据,另一组是英雄对象的格式,就好像它预期了质量分配一样?

  2. How come the require(:hero) doesn't raise an error when that key is not submitted? I assume the answer to this is because of what is automatically creating that second hash ("hero"=>{"name"=>"test"}} from question 1.

    为什么在未提交该密钥时,require(:hero)如何不引发错误?我假设答案是因为从问题1中自动创建第二个哈希(“hero”=> {“name”=>“test”}}。

Any information on what I am missing here would be greatly appreciated, as this is barebones rails behavior out-of-the-box.

任何有关我在这里缺少的信息都将非常感激,因为这是开箱即用的准系统导轨行为。

1 个解决方案

#1


2  

This behaviour comes from ActionController::ParamsWrapper:

此行为来自ActionController :: ParamsWrapper:

Wraps the parameters hash into a nested hash. This will allow clients to submit requests without having to specify any root elements.

将参数哈希包装到嵌套哈希中。这将允许客户端提交请求,而无需指定任何根元素。

Rails applications have parameter wrapping activated by default for JSON requests. You can disable it globally by editing config/initializers/wrap_parameters.rb, or for individual controllers by including wrap_parameters false in the controller.

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


推荐阅读
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 我们有(据我所知)星型模式SQL数据库中的数据文件。该数据库有5个不同的文件,扩展名为 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
林小秋
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有