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. HTML&CSS精选笔记_表格与表单

    表格与表单 表格标记 创建表格 要想创建表格,就需要使用表格相关的标记 <table>     <tr>     <td>单元格内的文字</td>   ...

  2. ios开发之--新手引导页的添加

    以往在写启动页面的时候,有时候会直接在启动页里面写,或者自带的vc里面直接写,但是那样并不是很方便,启动页里面往往会添加很多的东西,所以封装成一个单独的类,可以直接使用,即便是后期的更换,或者是其他的 ...

  3. 【RF库Collections测试】Dictionary Should Contain Value

    Name:Dictionary Should Contain ValueSource:Collections <test library>Arguments:[ dictionary | ...

  4. JS控制元素可见(显示)与不可见(隐藏)

    方法一: document.getElementById("id").style.visibility="hidden"; document.getElemen ...

  5. java基础---->Java关于复制的使用(一)

    这里简单记录一下java中关于浅复制和深复制的知识.很多时候,一个人选择了行走,不是因为欲望,也并非诱惑,他仅仅是听到了自己内心的声音. java中的复制clone方法 一.java对象的浅复制 一个 ...

  6. Tomcat7.0无法启动解决方法[failed to start]

    很奇怪的一个问题,Tomcat一直好好的,运行Servlet之后就报这个错: 为什么呢?在网上查都查不到解决方法,后来仔细检查了下Servlet,发现web.xml有个低级错误: 配置的Servlet ...

  7. struts2的s:iterator 标签 详解<转>

    struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几个简单的demo: s:iterator 标签有3个属性:     value:被迭代的集合     id   : ...

  8. 部署软件RDMA的步骤

    date:  2018-08-28   19:46:56 参考原文原文:http://corasql.blog.51cto.com/5908329/1930455                    ...

  9. nodejs MySQL操作

    一  wamp创建数据库 选择phpMyAdmin 选择用户,添加用户 填写数据库详细资料,填写完毕选择右下角的“执行” 用户添加成功 2. nodejs 安装mysql驱动  npm install ...

  10. .net asp iis服务器如何让外部访问自己的网站

    1.控制面板-防火墙-高级设置-入站规则-右侧的BranchCache内容检索,右键启用规则.