2016-07-06 2 views
1

У меня есть модель с именем User и во многих действиях я получаю ответ как json. напр, показывая пользовательские данные, я используюИзменение реакции JSON в рельсах?

@user = User.find_by_id(params[:id]) render json: {data: @user}

Теперь у меня есть требование, чтобы при реагировании пользовательских данных мне нужно, чтобы показать только Последние 2 цифры номера мобильного телефона для экс) ***** *** 78, есть ли способ достичь этого, потому что изменение ответа в каждом действии будет слишком сложным, так что есть ли способ написать общий метод для обработки этой ситуации.

ответ

2

Вы можете написать метод в user модели

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 

Вы можете написать метод, который маскирует начальные символы и сделать render json: {data: @user.as_json)}

заказ this ссылка

+0

Я выполнил то, что вы сказали, но иначе: «render json: {data: @ user.as_json (only: [: id,: email]), methods:: mask}', но у меня есть ответ ' {"id": 121, "email": "[email protected]", "mask": "******** 45"} 'т.е. имя метода является ключом мобильного номера. Можете, пожалуйста, выяснить, в чем проблема. –

+0

Вы можете назвать метод, который вы хотите, в ответ json – benchwarmer

+0

То, где проблема, мне нужен ответ, чтобы быть мобильным номером, но для маскирующей логики '' ******** "+ self.mobile_number.slice (8 , 9) ', если имя метода - mobile_number, это вызовет бесконечный цикл. –

0

Наконец я решил проблему на

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”:[email protected], 
    “mobile_number”: “********67” 
} 

И спасибо за benchwarmer's помощь.

Смежные вопросы