我想检查用户输入散列(传递给Rails控制器的参数)中的值。我想保护自己不受虚假用户输入的影响。Object#try保护我不会丢失输入,但是格式错误的输入怎么办?
简单的,不安全的情况:
if params[:credentials][:login] …显然,如果用户没有提供:credentials值,那么我的get :login尝试将失败…Nil没有方法:[]。一个非常好的解决方案是Object#try:
if params[:credentials].try(:[], :login) … 但是,如果问题是用户提供了格式错误的凭据呢?特别是,我的一个用户传递了一个数组,而不是散列。所以我还是得到了一个例外,
TypeError: can't convert Symbol into Integer有没有类似try()这样的东西,可以把伪装变成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) … 发布于 2012-08-04 04:28:49
您不应该在这里使用begin/rescue语句,因为它会降低性能,而且您的意图也不明确。try也是如此,它只是一个伪装的rescue nil。
你必须检查所有的东西,并且检查正确。把数据检查和逻辑混在一起是很难看的。
自从我看了Avdi的自信Ruby之后,我改变了我的编码方式;我建议你这样做(我只是稍微简化了你的代码):
def your_action
checked_params_for_action do
#safe params here
#your_controller_code
end
end
private
def checked_params_for_action(&block)
if (params[:credentials].is_a?(Hash) && params[:credentials][:login])
yield
else
redirect_to root_path, error: "params malformed"
end
endhttps://stackoverflow.com/questions/11802661
复制相似问题