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

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

?





1

2

3

4

5

6

[1] pry(#<BooksController>)> params

=> {"action"=>"show", "controller"=>"books", "id"=>"382"}

[2] pry(#<BooksController>)> params["id"]

=> "382"

[3] pry(#<BooksController>)> params[:id]

=> "382"

  由上边代码可知params是一个Hash.在正常的Hash下根据key取值只能用 :或者 ""一种取。

在irb调试代码:

?





1

2

3

4

5

6

7

yuyudemac-mini:~ yuyu$ irb

2.0.0-p451 :001
> a = {"id"
=> 1}

 => {"id"=>1}

2.0.0-p451 :002
> a["id"]

 => 1

2.0.0-p451 :003
> a[:id]

 => nil

  为什么在rails中params[:id]和params["id"]都能取到值呢?

其中的原因时因为

?





1

2

2.0.0-p451 :004
> a.class

 => Hash

  irb下的a的类时Hash

?





1

2

[5] pry(#<BooksController>)> params.class

=> ActiveSupport::HashWithIndifferentAccess

  而rails下的params类却是ActiveSupport::HashWithIndifferentAccess

HashWithIndifferentAccess是
Hash的子类,其中覆盖了rails源码中的default 方法,Hash当找不到 hash 的 key 时 会去寻找default值,去执行 default
方法 。

源码中的default方法:

?





1

2

3

4

5

6

7

def default(key = nil)

    if
key.is_a?(Symbol) && include?(key = key.to_s)

      self[key]

    else

      super

    end

end

  也就是说,在params中调用params[:id]时,满足key.is_a?(Symbol) && include?(key =
key.to_s)就去执行default方法,使:id和"id"对应一个value,这时再调用params["id"],params["id"]
等于params[:id]的值。

关于default方法参考地址:http://lukaszwrobel.pl/blog/ruby-hash-default-value

时间: 2024-10-06 11:24:14

rails中params[:id]与params["id"]分析的相关文章

RailsCast26 Hackers Love Mass Assignment rails中按params创建、更新model时存在的安全隐患

Mass assignment是rails中常用的将表单数据存储起来的一种方式.不幸的是,它的简洁性成了黑客攻击的目标.下面将解释为什么及如何解决. 上述表单为一个简单的注册表单.当用户填入name,点击提交时,一个新用户被创建.用户模型被如下定义: ruby create_table :users do |t| t.string :name t.boolean :admin, :default => false, :null => false end 当用户点击提交时,如下的action被执

[转] Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

转载自:http://www.dengchuanhua.com/132.html 在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位. 该项目地址为:https://github.com/twitter/snowflake是用Scala实现的. python版详见开源项目https://github.com/erans/pysnowflake.

Mysql批量插入返回Id错乱(原因分析)

在项目中经常会有如下场景: 往数据库中批量插入一批数据后,需要知道哪些插入成功,哪些插入失败了. 这时候往往会有两种思路,一个是在插入之前判断相同的记录是否存在,过滤掉重复的数据:另外一种就是边插入边判断,动态过滤. 第一种方式对于数据量过大的情况并不适用,为了采用第二种方法,我们使用了"Mybatis批量插入返回自增主键"的方式进行处理. mysql插入操作后返回主键是jdbc的功能,用到的方法是getGeneratedKeys()方法,使用此方法获取自增数据,性能良好,只需要一次交

用DataReader在comboBox中显示name,取值id:

定义ItemObject类 classItemObject { public int id; public string name; publicItemObject(int id,string name) { this.id=id; this.name =name; } public override string ToString() { return name; } } 1.实例化对象,加载数据 ItemObject[] io = new ItemObject[3];          

array_filter、find_in_set查询id是否在id集合中、concat连接字符串,ifnull、if用法

1:array_filter检查每个元素是不是数字 if(array_filter($this->data['log_id'] ,'is_numeric') !== $data['log_id']) echo '000'; 2:concat连接字符串,ifnull.if用法update logset users = concat(ifnull(users,''),if(users,',411','411'))where log_id between 453729 and 453740; 3:fi

css中的类样式和id样式有何区别?

W3C标准中对于ID与CLASS的设定是:ID具有唯一性,CLASS具有普遍性. 而目前大部分浏览器确实可以定义页面中多个元素的ID相同,并赋以相同的样式,因为目前的浏览器和CSS都对其睁一只眼闭一只眼. 就比如说法律规定你做好事,但你也可以去做坏事一样.这是一个标准,你可以遵守,也可以不遵守,但是不遵守的后果很严重. 在CSS中你可能不会碰到太大的问题.但是当用JavaScript调用ID时,问题就来了,比如下面的代码: <p id="html">第一段文字</p&

OpenERP 在context中写自己的部门ID

转:http://blog.csdn.net/littlebo01/article/details/17554953 [python] view plaincopyprint? 使用OpenERP自定义模块开发的时候,你会发现,有一个uid(当前登录用户id)特别好用,不管是在xml的domain 条件表达式中,还是在类中,都能很方便的使用uid.有一段时间就一直在琢磨,这个uid 是什么时候赋值的.感觉是在 session中,一直没有找到.后来需要获取当前登录人的部门id,把departmen

jQuery选择器中,通配符[id^=&#39;code&#39;]input[id$=&#39;code&#39;][id*=&#39;code&#39;]

1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']");//id属性以code结束的所有input标签 $("input[id*='code']");//id属性包含code的所有input标签 (2)根据索引选择 $("tbody tr:even"); //选择索引为偶数的所有tr标签 $("tbody

liferay中如何获取实例的id和portletId

在Portlet中request分为两种renderRequet和actionRequest而portlet需要取得实例Id的时候都在renderRequest的时候才可以取到,如下例子 PortletPreferences preferences = renderRequest.getPreferences(); String portletResource = ParamUtil.getString(request, "portletResource"); if (Validato