在后台接收表单参数的时候,有时候我用 parmas[:samething] 时,查找为 nil,用 pamas["samething"] 才可以。困惑的是有时候两者都可以。pamas["parameter_name"] 和 pamas[:parameter_name] 有区别吗?那一种是正规的写法写法 yo
两种都 ok,应该不会出现某种不行的情况
http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html
webserver 的框架大都是依赖于 rack 的,rack 里面的 params,在你取的时候会将 key 进行 to_s 操作的,详见 https://github.com/rack/rack/blob/028438ffffd95ce1f6197d38c04fa5ea6a034a85/lib/rack/auth/digest/params.rb#L29
如果我没记错的话,如果 params 是从 json 数据通过 ActiveSupport::JSON.decode 转过来的,貌似只能用 params['something'] 而不能用 params[:something]。记不太清楚了。
[有时候我用 parmas[:samething] 时,查找为 nil,用 pamas["samething"] 才可以] 先找出上面的拼写错误,再去看你自己的代码是不是手误。
源码里只是简单地把 symbol 转化成 string 来用,所以不太可能会出现你说得这种坑吧。
def fetch(key, *extras)
super(convert_key(key), *extras)
end
def convert_key(key)
key.kind_of?(Symbol) ? key.to_s : key
end
params["parameter_name"] 和 params[:parameter_name] 这两种写法肯定都是对的,因为 rails 扩展了原生的 Hash key 的读取,如果不对的话,要么是错觉,要么其他错误吧。
Object::HashWithIndifferentAccess < Hash
#Implements a hash where keys :foo and "foo" are considered to be the same.
ActionController::Parameters < ActiveSupport::HashWithIndifferentAccess
#params 是HashWithIndifferentAccess
原生的 ruby 是没法做到这一点的,如果设置的 key 是 symbol,那读取也必须是 symbol