新手问题 对 Rails params 的困惑

yunshang · February 24, 2016 · Last by mr_night replied at February 27, 2016 · 2944 hits

在后台接收表单参数的时候,有时候我用 parmas[:samething] 时,查找为 nil,用 pamas["samething"] 才可以。困惑的是有时候两者都可以。pamas["parameter_name"] 和 pamas[:parameter_name] 有区别吗?那一种是正规的写法写法 yo

没遇到过关注一下这个问题,不过还是把 code 贴出来吧

是 params[],不是 parmas[], 单词拼写错误

webserver 的框架大都是依赖于 rack 的,rack 里面的 params,在你取的时候会将 key 进行 to_s 操作的,详见 https://github.com/rack/rack/blob/028438ffffd95ce1f6197d38c04fa5ea6a034a85/lib/rack/auth/digest/params.rb#L29

两种都可以,出错与 params 无关,还是贴代码吧。

你应该用 params[].blank? 来判断是否为空内容

如果我没记错的话,如果 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

我来确认一下:

谢谢你,我一整天都在怀疑,我是否真的打错了

#8 楼 @sandy_xu 我真没打错....10 楼给错解释了

#12 楼 @yunshang 我引用你的那段文字中是有错误的,你先把文章中错误的部分改对。

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

You need to Sign in before reply, if you don't have an account, please Sign up first.