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