Activerecord find_by_id奇怪的行为

时间:2016-06-23 06:11:15

标签: ruby-on-rails activerecord

考虑我在控制器中有一个show方法,如下所示:

class ThingsController < ApplicationController
    def show
        thing = Thing.find_by_id(params[:id])
        render json: 'Not Found', status: :not_found and return if !thing
        render json: thing.to_json, status: :ok
    end
end

数据库中只有1条记录,id = 1。

现在,这是我的测试:

  1. 当我打电话/事物/ 1时,我可以得到记录。
  2. 当我打电话给/ things / 2时,我得到404。
  3. 当我打电话给/ things / a1时,我得到404。
  4. 当我调用/ things / 1a时,我期待错误,但它给了我id = 1的记录。
  5. #4正常吗?如何防止?

    Rails版本:4.2.6

2 个答案:

答案 0 :(得分:2)

.find_by_id()方法将参数传递给整数,因为1a.to_i1,它返回一个记录值。

如果你想阻止这种情况,你必须检查传入的param[:id]是否仅包含数字。

'1a' !~ /\D/                # false
'12' !~ /\D/                # true

# So, use it in the if
params[:id] !~ /\D/

答案 1 :(得分:1)

因为id的类型是整数,所以在使用to_i函数创建查询字符串之前,活动记录会将其转换为整数。如果您不希望用户使用此类链接查看详细信息,则有许多方法可以防止,例如某些方法:

1.Validate params [:id]是ThingsController

中的数字

2.在find_by_id

中创建类方法Thing
class class Thing < ActiveRecord::Base   
  def self.find_by_id(id)
    validate_type_id!(id) # Have to define the function to raise not found exception if invalid format type
    super   
  end
end