zoukankan      html  css  js  c++  java
  • rails中params[:id]与params["id"]分析

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

    [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调试代码:

    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"]都能取到值呢?

    其中的原因时因为

    2.0.0-p451 :004 > a.class
     => Hash 
    

      irb下的a的类时Hash

    [5] pry(#<BooksController>)> params.class
    => ActiveSupport::HashWithIndifferentAccess
    

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

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

    源码中的default方法:

    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

  • 相关阅读:
    SQL中sum(),avg()等统计结果为null的解决方法
    PowerDesigner教程系列(六)概念数据模型
    只能输入正整数 已经常用的正则表达式
    PowerDesigner教程系列(四)概念数据模型
    linux全局页目录项
    开始吧
    Tomcat最大连接数问题
    CKEDITOR使用与配置
    /proc/cpuinfo 文件分析(查看CPU信息)
    Tomcat SSL配置及Tomcat CA证书安装
  • 原文地址:https://www.cnblogs.com/wangyuyu/p/3737467.html
Copyright © 2011-2022 走看看