我想检查用户输入哈希中的值(传递给 Rails 控制器的参数)。我想保护自己免受虚假用户输入的侵害。Object#try 可以防止我丢失输入,但是格式错误的输入呢?
简单,不安全的情况:
if params[:credentials][:login] …
显然,如果用户没有提供 :credentials 值,那么我尝试获取 :login 将失败……Nil 没有方法 :[]。一个非常好的解决方案是 Object#try:
if params[:credentials].try(:[], :login) …
但是,如果问题是用户提供了格式错误的凭据怎么办?特别是,我的一个用户传递了一个数组,而不是一个哈希。所以我仍然得到一个例外,
TypeError: can't convert Symbol into Integer
有没有类似 try() 的东西,可以将任何 bogosity 变成 false/nil?
我能来的最接近的是
if begin params[:credentials][:login]; rescue; false; end …
这有点混乱——不过,我承认,它比明确的偏执狂更紧凑、更笼统:
if (params.has_key? :credentials and params[:credentials].is_a? Hash and params[:credentials].has_key? :login) …