这可能是一个学术/哲学问题,但假设我有一个资源,在Rails中,并且我获得localhost:3000/resources/2foobar
,这就像foobar
不在那里一样。虽然这一开始很酷,但如果在幕后可能缺少某些东西,那就引出了一个问题。我一般都信任开源项目,Rails已经存在了足够长的时间让我自信,但如果我们能够验证参数以检查它是否是严格的数字并且不仅仅是以数字开头,那不是更好吗?例如,我可以修改我的show
方法,如
if (Integer(params[:id]) != nil rescue false)
render json: @resource
else
head: 400
end
有人可以解释在Rails中将1duh
视为1
的理由吗?
编辑示例请求
$ curl 'localhost:3000/resources/1ds'
对应日志
Started GET "/resources/1ds" for ::1 at 2016-06-26 20:35:59 +0100
Processing by ResourcesController#show as */*
Parameters: {"id"=>"1ds"}
Resource Load (0.3ms) SELECT `resources`.* FROM `resources` WHERE `resources`.`id` = 1 LIMIT 1
Completed 200 OK in 9ms (Views: 0.7ms | ActiveRecord: 0.3ms)
卷曲返回
{"id":"1","data":"foobarsampledata"}
答案 0 :(得分:2)
好的,here是你的答案:
如果主键是整数,则按id查找使用to_i强制其参数。
Person.find("1") # returns the object for ID = 1
Person.find("31-sarah") # returns the object for ID = 31
所以,理由是你的主要关键。我想,如果您的主键不是整数,那么(转换为__)就不会发生。