Ruby on rails 在rails中改变JSON响应?

Ruby on rails 在rails中改变JSON响应?,ruby-on-rails,json,rendering,response,Ruby On Rails,Json,Rendering,Response,我有一个名为User的模型,在许多操作中,我将响应呈现为json。例如,在显示用户数据时,我使用 @user=user.find\u by_id(参数[:id]) 呈现json:{data:@user} 现在我有一个要求,在响应用户数据时,我只需要显示手机号码的最后2位(例如)********78,有没有办法做到这一点,因为更改每个操作中的响应太难了,所以有没有办法编写一个通用方法来处理这种情况。您可以在用户模型中编写一个方法 user.rb def as_json(options = {}

我有一个名为User的模型,在许多操作中,我将响应呈现为json。例如,在显示用户数据时,我使用


@user=user.find\u by_id(参数[:id])
呈现json:{data:@user}


现在我有一个要求,在响应用户数据时,我只需要显示手机号码的最后2位(例如)********78,有没有办法做到这一点,因为更改每个操作中的响应太难了,所以有没有办法编写一个通用方法来处理这种情况。

您可以在
用户
模型中编写一个方法

user.rb

def as_json(options = {})
  # use options as per need
  {id: self.id, name: self.name, mobile: mask}
end

def mask
  # masking logic
end
您可以编写一个方法来屏蔽初始字符,并执行
呈现json:{data:@user.as_json)}


签出链接

最后我通过

def as_json(options = {})
  users = super
  users['mobile_number'] = "********" + users['mobile_number'].slice(8,9).last if users['mobile_number'].present?
  users
end
当我打电话时

 render json: {data: @user.as_json}
即使@user可以包含记录的集合,每个记录的手机号码也将以*******78格式呈现

现在的反应是

{
    “id”: 143,
    “email”:test1@test.com,
    “mobile_number”: “********67”
}

谢谢你的帮助。

我已经执行了你所说的,但是以不同的方式
呈现json:{data:@user.as_json(仅:[:id,:email]),methods::mask}
,但我有回应
{“id”:121,“email”:”test@test.com,“mask”:“**********45”}
ie方法的名称是手机号码的键。请找出问题所在。您可以在json responseThats中随意命名方法。问题在于,我需要的响应是mobile number,但对于掩蔽逻辑
“**********”+self.mobile_number.slice(8,9)
,如果方法名称是mobile_number,它将导致无限循环。是的,它正在工作。谢谢你的帮助,但是我有另一个问题,我有一些列要排除,一些列要包含,这在不同的操作上是不同的,但是如果我像这样覆盖as_json,我将无法这样做,是否还有其他选择。现在我已经通过使用
render json:{data:@user.as_json(仅:[id,:email])merge解决了这个问题(mobile_number:@user.mask)}
但是还有一个问题,在某些操作中,我需要显示用户列表,这个解决方案不适合那里。