在Rails的controller中访问params的一个小细节

阅读更多
大家都知道controller中的params其实是一个Hash.
一般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

然后就上演了一出反复调试的悲剧...

撰文记之,告诫一下自己要注意细节.

你可能感兴趣的:(Rails,Ruby)