x無法存取,你可能沒有權限或未登入。
2a01ae9942939ee2b3954a6727d2bb92

params["id"] instead of params[:id]

2012-03-03 15:30:13 +0800tonytonyjanRuby on Rails 節點 中發起
最後由 匿名 於回應 , 296次閱讀

在寫 rails 時,在 controller 中用到 params 這個 hash 是很常見的,但我突然想知道為什麼 params[:id]params["id"] 都可以 access 同一份資料,於是展開了 trace code 奇幻之旅。

我臨時寫了一個程式,trace params[:id],再 trace params["id"],並用等於符號分隔,看他們之間的不同:

set_trace_func proc { |event, file, line, id, binding, classname|
   printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}
params[:id]
set_trace_func nil
puts "====================="
set_trace_func proc { |event, file, line, id, binding, classname|
   printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}
params["id"]
set_trace_func nil

我本來以為使用 Symbol 替代 String 是比較快的,想不到 rails 下當我們呼叫 params[:key_name] 時,會徒增許多 call stack,事實就是,rails 還得幫我們把 Symbol 轉成 String。

c-return D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:61 set_trace_func   Kernel
    line D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:62 UpdatePlayerInfo ApiController
    call C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_controller/metal.rb:143     params ActionController::Metal
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_controller/metal.rb:144     params ActionController::Metal
    call C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/http/parameters.rb:8  parameters ActionDispatch::Http::Parameters
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/http/parameters.rb:9  parameters ActionDispatch::Http::Parameters
  return C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/http/parameters.rb:14 parameters ActionDispatch::Http::Parameters
  return C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_controller/metal.rb:145     params ActionController::Metal
  c-call D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:62         []     Hash
    call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:32    default ActiveSupport::HashWithIndifferentAccess
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:33    default ActiveSupport::HashWithIndifferentAccess
  c-call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:33      is_a?   Kernel
c-return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:33      is_a?   Kernel
  c-call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:33       to_s   Symbol
c-return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:33       to_s   Symbol
    call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:88       key? ActiveSupport::HashWithIndifferentAccess
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:89       key? ActiveSupport::HashWithIndifferentAccess
    call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:152 convert_key ActiveSupport::HashWithIndifferentAccess
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:153 convert_key ActiveSupport::HashWithIndifferentAccess
  c-call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:153   kind_of?   Kernel
c-return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:153   kind_of?   Kernel
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:153 convert_key ActiveSupport::HashWithIndifferentAccess
  return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:154 convert_key ActiveSupport::HashWithIndifferentAccess
  c-call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:89       key?     Hash
c-return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:89       key?     Hash
  return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:90       key? ActiveSupport::HashWithIndifferentAccess
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:36    default ActiveSupport::HashWithIndifferentAccess
  c-call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:36    default     Hash
c-return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:36    default     Hash
  return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:38    default ActiveSupport::HashWithIndifferentAccess
c-return D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:62         []     Hash
    line D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:63 UpdatePlayerInfo ApiController
  c-call D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:63 set_trace_func   Kernel
=====================
c-return D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:67 set_trace_func   Kernel
    line D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:68 UpdatePlayerInfo ApiController
    call C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_controller/metal.rb:143     params ActionController::Metal
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_controller/metal.rb:144     params ActionController::Metal
  return C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_controller/metal.rb:145     params ActionController::Metal
  c-call D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:68         []     Hash
    call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:32    default ActiveSupport::HashWithIndifferentAccess
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:33    default ActiveSupport::HashWithIndifferentAccess
  c-call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:33      is_a?   Kernel
c-return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:33      is_a?   Kernel
    line C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:36    default ActiveSupport::HashWithIndifferentAccess
  c-call C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:36    default     Hash
c-return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:36    default     Hash
  return C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/hash_with_indifferent_access.rb:38    default ActiveSupport::HashWithIndifferentAccess
c-return D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:68         []     Hash
    line D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:69 UpdatePlayerInfo ApiController
  c-call D:/TonySpace/workspace/monster-fighter/app/controllers/api_controller.rb:69 set_trace_func   Kernel

另外我想請教前輩們,你們在 trace code 有什麼樣的技巧呢?我最常用的是 grep、find 和上述的 set_trace_func。

暫無回應。
需要 登入 後方可回應,如果你還沒有帳號按這裡 註冊