代码之家  ›  专栏  ›  技术社区  ›  Morpheu5

为什么像“1duh”这样的请求参数在Rails中被视为“1”?

  •  0
  • Morpheu5  · 技术社区  · 8 年前

    这可能是一个学术/哲学问题,但假设我在Rails中有一个资源 localhost:3000/resources/2foobar ,这就好像 foobar 当时不在那里。虽然一开始这很酷,但它回避了一个问题,即幕后是否可能缺少一些东西。我通常信任开源项目,Rails已经存在了足够长的时间,我对此充满信心,但如果我们能够验证参数,以检查它是否是严格的数字,而不仅仅是从数字开始,不是更好吗?例如,我可以修改我的 show 类似方法

    if (Integer(params[:id]) != nil rescue false)
      render json: @resource
    else
      head: 400
    end
    

    有人能解释一下治疗的理由吗 1duh 1 ,在Rails中?

    编辑 示例请求

    $ 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 回复  |  直到 8 年前
        1
  •  2
  •   user4776684 user4776684    8 年前

    好啊 here 您的答案是:

    如果主键是整数,find by id将使用to_i强制其参数。

    Person.find("1")        # returns the object for ID = 1
    Person.find("31-sarah") # returns the object for ID = 31
    

    所以,基本原理是你的主键。我猜,如果您的主键不是整数,那么(转换为_I)就不会发生。