Ruby on rails ActiveRecord.find(id)方法的一个奇怪之处

Ruby on rails ActiveRecord.find(id)方法的一个奇怪之处,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,如果我有一个ID为1的Post模型 我可以通过以下方式访问此资源: http://localhost:3000/posts/1 但奇怪的是,当我使用这些URL时,我可以得到相同的结果 http://localhost:3000/posts/1somethingweird-blah-blah-blah-idont-like-this 如何防止这种情况发生?两个主要选项: 验证控制器中的参数(例如,使用正则表达式) 它工作的原因是因为有两个主要选项: 验证控制器中的参数(例如,使用正则表

如果我有一个ID为1的Post模型

我可以通过以下方式访问此资源:

 http://localhost:3000/posts/1
但奇怪的是,当我使用这些URL时,我可以得到相同的结果

 http://localhost:3000/posts/1somethingweird-blah-blah-blah-idont-like-this
如何防止这种情况发生?

两个主要选项:

  • 验证控制器中的参数(例如,使用正则表达式)
  • 它工作的原因是因为有两个主要选项:

  • 验证控制器中的参数(例如,使用正则表达式)

  • 它工作的原因是因为
    “1abc”。to_i==1

    这可能是因为
    参数[:id]
    正在从
    字符串转换为
    int
    ,在Ruby中调用
    “1somethingweird诸如此类”。to_i
    实际上会导致
    1

    您可以在管线级别修复此问题:

    resources :posts, :constraints => {:id => /[0-9]+/}
    

    这可能是因为
    params[:id]
    正在从
    字符串转换为
    int
    ,并且在Ruby中调用
    “1somethingweird blah blah blah blah idon This”。to_i
    实际上会导致
    1

    您可以在管线级别修复此问题:

    resources :posts, :constraints => {:id => /[0-9]+/}
    

    这是因为.find本质上只接受您传入的任何参数并对其执行a to_i,因此字符串
    '1somethingweird-blah-blah-blah-idon-like-This'。to_i
    将返回1这是因为。find本质上只接受您传入的任何参数并对其执行a to_i,因此字符串
    '1somethingweird-blah-blah-blah-idon-like-this'。to_i
    将基本返回1。find(x)期望x是id的整数,并将其转换为..@bullfrog是的,完全正确。大多数语言在将
    字符串
    转换为
    int
    时都会失败,但Ruby喜欢务实另一方面,这是一种为rails应用程序创建漂亮URL的快速方法,而不是枯燥的旧id:)基本上。find(x)希望x是id的整数,并将其转换为..@bullfrog是的,没错。大多数语言在将
    字符串
    转换为
    int
    时都会失败,但Ruby喜欢务实另一方面,这是一种为rails应用程序提供漂亮URL的快速方法,而不是无聊的旧ID:)