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的更多相关文章

  1. rails中params[:id]与params["id"]分析

    写这个帖子的缘由是因为在页面参数传到rails的controller时用params[:]和params[""]都可以取到值: [1] pry(#<BooksControll ...

  2. Rails sanitize

    The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements. T ...

  3. nginx中error_page没有生效(nginx+passenger+rails)

    应用部署方式为 nginx + passenger + rails 当我想要用nginx来默认处理400以上状态时,发现在rails返回respose之后,nginx不会再次执行error_page( ...

  4. Ruby on Rails 创建https应用

    1. 创建证书请求文件条件:私钥+证书签名请求+opensslyum install -y opensslmkdir /root/ssl/ && cd /root/ssl/openss ...

  5. Rails 5 开发进阶

    Rails 5 开发进阶:https://www.gitbook.com/book/kelby/rails-beginner-s-guide/details   cancan : http://blo ...

  6. rails程序文件名命名规范

    1 一般文件名是用小写单词加下划线分割,但类的名字用骆驼法.例如 sessions_controller.rb中定义SessionsController. 2 helpers内的文件为辅助类,定义了许 ...

  7. rails中的form_for

    1 form_for方法是ActionView::Helpers::FormHelper模块内的方法,所以可以在ActionView的实例中直接调用 2 from_for方法的原型为form_for( ...

  8. rails中的session

    学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...

  9. Ubuntu配置Ruby和Rails

    安装curl sudo apt-get install curl 安装RVM curl -L https://get.rvm.io | bash -s stable 通过RVM来安装Ruby rvm ...

随机推荐

  1. Java精选笔记_Servlet技术

    Servlet技术 Servlet开发入门 Servlet接口 针对Servlet技术的开发,SUN公司提供了一系列接口和类,其中最重要的是javax.servlet.Servlet接口. Servl ...

  2. Oracle-随机数获取

    1.获取10-100的数据,保留两位小数 select trunc(dbms_random.value(10,100),2) from dual ; 2.获取0-1的小数 select dbms_ra ...

  3. SGA内存的优化

    查看SGA有关的系统参数即介绍 SQL> show parameter sga NAME TYPE VALUE ------------------------------------ ---- ...

  4. thinkjs之页面跳转-同步异步

    对于刚入手thinkjs项目的新手来说,时常会犯的一个错误就是“混用”各种代码逻辑,比如:我们经常在做后台管理系统的时候用到的登录框, , 其实它原本是有一个路由专门存放自己的代码逻辑,而在点击提交按 ...

  5. pycharm激活地址

    http://elporfirio.com:1017 http://idea.iteblog.com/key.php

  6. Go基础---->go的基础学习(五)

    这里是go中关于io的一些知识.有时不是你装得天衣无缝,而是我愿意陪你演得完美无缺. go中关于io的使用 一.Reader中的Read方法 Read 用数据填充指定的字节 slice,并且返回填充的 ...

  7. linux ctags

    在vim 下查找函数的定义是比较方法的事情,尤其是是跨文件的时候. 这时候可以通过安装ctags来实现函数定义跳转. 安装可以直接百度. 安装好之后,首先需要配置vim, 因为一般只有vim打开的文件 ...

  8. 布局的诡异bug合集+解决方法(更新中)

    1.元素内部子元素的margin的边界线基准点的问题 论如何生硬起名字!!我反正已经被自己总结的题目绕晕了... “演员”介绍: 外层父元素:蓝色边框: 内部子元素:绿色区域: 粉红色区域是元素内部绿 ...

  9. hdu4028 The time of a day[map优化dp]

    The time of a day Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others ...

  10. Mac OS X运行程序出现bad interpreter: operation not permitted的解决方案

    最近想在我的mac笔记本上安装gvim,从官网上下载了程序后竟然非常诡异的双击无法打开,命令行执行时系统报错: /bin/sh bad interpreter operation not permit ...