这尤其适用于使用REST
和Ruby
构建的Sinatra
API。
手动检查以确保所需的参数不是零是很容易的。并且很容易迭代一个平坦的参数哈希,看看它是否允许在白名单中。
然而,当params散列也包含哈希时,它变得更加困难。
我想到的一种处理方法是将params散列转换为JSON
并使用库来对JSON
架构进行验证。
我遇到了sinatra-param宝石,但我没有机会看到它是否可以验证子哈希或检查不支持的参数。
编辑:另一种可能更有意义的方法是将params直接传递给模型(我正在使用DataMapper)并使用其验证和错误而不是重写验证。
答案 0 :(得分:1)
如果你的每个路由都采用相同的4个参数(IE :one, :two, :three, :four
),你可以设置一个前置过滤器,将这四个参数的数组存储为之前的实例变量(这是所有路线均可访问)并使用名为all?
的类Enumerable中的性感小方法:
before do
@base_params = [params[:one], params[:two], params[:three], params[:four]]
unless @base_params.all?
redirect '/error_route'
end
end
仅当“收藏集”中的所有值都不是Enumerable#all?
或false
时, nil
才会返回true。可以找到文档here for Ruby 1.9
另外,如果你发现你有不同的参数集,你可以创建一个哈希而不只是一个@base_params数组,其中键是request.request_method的字符串值:
before do
@base_params = {"GET" => [params[:one], params[:two], params[:three], params[:four]],
"POST" => [params[:five], params[:six], params[:seven]],
"PUT" => [params[:one], params[:five], params[:six]]}
unless @base_params[request.request_method].all?
redirect '/error_route'
end
end