Rails的HashWithIndifferentAccess
ruby 2.0 引入了keyword arguments,方法的参数可以这么声明
def foo(bar: 'default')
puts bar
end foo # => 'default'
foo(bar: 'baz') # => 'baz'
在某些情况下,参数可能已经保存到了一个hash中的时候,也可以这么调用
params = {bar: 'baz'}
foo(params) # => 'baz'
在rails中,请求传过来的参数都会变成HashWithIndifferentAccess,可以通过Symbol或者String作为key获取value
params = {bar: 'baz'}.with_indifferent_access
params[:bar] # => 'baz'
params['bar'] # => 'baz'
如果直接将HashWithIndifferentAccess作为参数传给keyword arguments的方法,是行不通的
params = {bar: 'baz'}.with_indifferent_access
foo(params) #  ArgumentError: wrong number of arguments (1 for 0)
这是因为HashWithIndifferentAccess中是以String作为key的,本质上和以下的错误是一样的
params = {'bar' => 'baz'}
foo(params) #  ArgumentError: wrong number of arguments (1 for 0)
所以需要将HashWithIndifferentAccess转换成以Symbol作为key
params = {bar: 'baz'}.with_indifferent_access
foo(params.symbolize_keys) #  'baz'
有人提过相关的issue给rails和ruby
https://bugs.ruby-lang.org/issues/9731
rails/rails#14643
HashWithIndifferentAccess使用String作为key的原因之一是因为2.2之前的ruby版本是不能垃圾回收Symbol。
Rails的HashWithIndifferentAccess的更多相关文章
- rails中params[:id]与params["id"]分析
		写这个帖子的缘由是因为在页面参数传到rails的controller时用params[:]和params[""]都可以取到值: [1] pry(#<BooksControll ... 
- Rails sanitize
		The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements. T ... 
- nginx中error_page没有生效(nginx+passenger+rails)
		应用部署方式为 nginx + passenger + rails 当我想要用nginx来默认处理400以上状态时,发现在rails返回respose之后,nginx不会再次执行error_page( ... 
- Ruby on Rails 创建https应用
		1. 创建证书请求文件条件:私钥+证书签名请求+opensslyum install -y opensslmkdir /root/ssl/ && cd /root/ssl/openss ... 
- Rails 5 开发进阶
		Rails 5 开发进阶:https://www.gitbook.com/book/kelby/rails-beginner-s-guide/details cancan : http://blo ... 
- rails程序文件名命名规范
		1 一般文件名是用小写单词加下划线分割,但类的名字用骆驼法.例如 sessions_controller.rb中定义SessionsController. 2 helpers内的文件为辅助类,定义了许 ... 
- rails中的form_for
		1 form_for方法是ActionView::Helpers::FormHelper模块内的方法,所以可以在ActionView的实例中直接调用 2 from_for方法的原型为form_for( ... 
- rails中的session
		学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ... 
- Ubuntu配置Ruby和Rails
		安装curl sudo apt-get install curl 安装RVM curl -L https://get.rvm.io | bash -s stable 通过RVM来安装Ruby rvm ... 
随机推荐
- nodejs搭建简单web服务器!!
			var http = require("http"), url = require("url"), path = require("path" ... 
- Qt监控Arduino开关状态(读取串口数据)
			setup.ini配置文件内容 [General] #游戏所在主机IP GameIp1=192.168.1.151 GameIp2=192.168.1.152 GameIp3=192.168.1.15 ... 
- 改变PS1的颜色
			我们能够通过配置PS1变量使提示符成为彩色.在PS1中配置字符序列颜色的格式为: \[\e[F;Bm\] 基本上是夹在 "\e["(转义开方括号)和 &qu ... 
- IIC协议
			总线信号 : SDA :串行数据线 SCL :串行时钟 总线空闲状态 : SDA :高电平 SCL :高电平 起始位:SCL为高电平期间 SDA出现下降沿 终止位:SCL为高电平期间 SDA ... 
- C++中的字节对齐分析
			struct A { int a; char b; short c; }; struct B { char a; int b; short c; }; #pragma pack(2) struct C ... 
- 在Linux中的.iso文件的处理方法
			1,mkdir /a 2,mount MLNX_OFED_LINUX-4.4-2.0.7.0-rhel7.3-x86_64.iso /a3,cd /a4,这样就可以对文件进行操作了 
- elk日志分析与发掘深入分析
			elk日志分析与挖掘深入分析 1 为什么要做日志采集? 2 挖财自己的日志采集和分析体系应该怎么建? 2.1 日志的采集 2.2 日志的汇总与过滤 2.3 日志的存储 2.4 日志的分析与查询 3 需 ... 
- linux对文件某列求和
			对文件某列求和: -F,用,号分隔,求第3行的和 awk -F, '{sum += $3};END {print sum}' test 
- JSP教程
			http://www.runoob.com/jsp/jsp-tutorial.html 
- 【node】------node连接mongodb操作数据库------【巷子】
			1.下载第三方模块mongodb cnpm install mongodb --save 2.检测是否连接成功 1.引入第三方模块mongodb并创建一个客户端 const MongoClient = ... 
