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. day10<面向对象+>

    面向对象(package关键字的概述及作用) 面向对象(包的定义及注意事项) 面向对象(带包的类编译和运行) 面向对象(不同包下类之间的访问) 面向对象(import关键字的概述和使用) 面向对象(四 ...

  2. Effective C++ Item 19 Treat class design as type design

    Too high class topic for me now ................... ................... ................... fill the ...

  3. AsycnTask

    一.异步任务加载网络数据: 在Android中提供了一个异步任务的类AsyncTask,简单来说,这个类中的任务是运行在后台线程中的,并可以将结果放到UI线程中进行处理,它定义了三种泛型,分别是Par ...

  4. Effective C++ —— 资源管理(三)

    条款13 : 以对象管理资源 假设有如下代码: Investment* createInvestment(); //返回指针,指向Investment继承体系内的动态分配对象,调用者有责任删除它 vo ...

  5. solr删除数据的4种方便快捷的方式

    1.在solr客户端,访问你的索引库(我认为最方便的方法) 1)documents type 选择 XML  2)documents 输入下面语句 <delete><query> ...

  6. JS-缓冲运动:菜单栏型悬浮框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. C++ XML 序列化器

    http://www.cppblog.com/xlshcn/archive/2007/11/21/cppxmlserializer.html

  8. 深入理解javascript原型和闭包 摘要

    一切(引用类型)都是对象,对象是属性的集合 对象都是通过函数创建的 隐式原型 Instanceof的判断队则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条 ...

  9. 获得当前正在显示的activity的类名

    需要加一个权限: <uses-permission android:name="android.permission.GET_TASKS"/> ActivityMana ...

  10. SSH电力项目四-显示首页

    1.登录页面: 将上一节中的页面放到/WEB-INF/page/目录下,需要登录后才能访问该页面: 对应页面:/WEB-INF/page/menu/home.jsp <%@ page langu ...