为什么请求参数如`1duh`在Rails中被视为`1`?

时间:2016-06-26 19:47:30

标签: ruby-on-rails validation parameters

这可能是一个学术/哲学问题,但假设我有一个资源,在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"}

1 个答案:

答案 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

所以,理由是你的主要关键。我想,如果您的主键不是整数,那么(转换为__)就不会发生。