是否有最佳实践来验证控制器中的参数?
@user = User.find_by_id(params[:id])
如果我篡改参数给它一个无效的:id
参数,比如访问“/ users / test”,我可以生成以下错误:
Conversion failed when converting the nvarchar value 'test' to data type int.
我现在正在考虑不会直接进入模型并且可以通过模型验证进行验证的参数。
答案 0 :(得分:2)
是的,您应该始终验证您的参数。人们总是可以在Web浏览器的地址栏中查看参数,或者修改存储在DOM中的参数。可以搞砸参数的另一个例子是网页是否长时间打开。想象一下有人正在查看页面“/ users / 3 / edit”并将其打开一小时,然后点击刷新。同时用户可能已被删除。你不希望你的网站崩溃 - 它应该优雅地处理它。
根据您的数据库和适配器,执行User.find_by_id("test")
不会崩溃。但是您的数据库/适配器无法将字符串转换为整数。在这种特殊情况下你可以做的一件事就是使用Ruby的.to_i
方法。
User.find_by_id(params[:id].to_i)
如果params[:id] = "12"
,Ruby会将其转换为整数12
,代码运行正常。如果params[:id] = "test"
,Ruby会将其转换为整数0
,并且您永远不应该拥有ID为0的数据库记录。
您也可以使用regular expressions to test if a string is an integer。
但总的来说,是的,尝试始终验证您的参数,以便您可以优雅地处理错误并控制进来的数据。