一般params中的数据,从log可以看到如下的样式:
Parameters: {"authenticity_token"=>"AOE3ui28pCMQpMuR77aY1EkoKVaAV1T05uep5to2X4Q=", "user"=>{"name"=>"yanghuan", "password_confirmation"=>"1234567", "password"=>"12345678"}}
按照标准的Hash方法,应当这样使用:
name = params["user"]["name"] # 请注意,用是的string,而不是symbal #但是一般我们都是使用symbal来访问的 name = params[:user][:name]
请看注意看到log的数据,params中的key是string而不是symbal
h = {"name" =>'string'} h[:name] = 'symbal' puts h # => {"name"=>"string", :name=>"symbal"} #可见,"name" 与 :name 是两个不同的key
但是在params中,我们可以使用symbal来访问,那是因为rails对params做了增强(我没有去看rails关于params的源代码)
之前我一直没有留意这个细微的区别,直到有一天,我写下了如下代码:
conditions = {}.merge(params) conditions.delete_if{|k,v| !v.is_a?(String) || v.eql?('') || %w{-1 0}.include?(v.to_s) || %w{action format controller commit page}.include?(k.to_s) } if conditions[:user][:name] == 'ooxx' # 使用symbal是访问不了的... # code ... end
然后就上演了一出反复调试的悲剧...
撰文记之,告诫一下自己要注意细节.