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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM