Как переопределить метод "as_json" или "to_json" для того, чтобы "response_to" не включать указанную информацию?

Я использую Ruby on Rails 3, и я хотел бы переопределить (возможно, в файле модели) as_json или же to_json метод для того, чтобы respond_to HTTP-запрос без включения некоторой информации.

В моей модели учетной записи у меня есть

def as_json(options = {})
  super(
    :except => [
      :password
    ]
  )
end

У меня в контроллере есть

format.json {
  render :json => @account, :status => 200
}

Когда я делаю запрос, например, /account/1.json У меня есть также атрибуты пароля, которые по соображениям безопасности я не хочу.

Итак, как я могу предотвратить включение указанной информации?


Я могу сделать это, и это работает

format.json {
  render :json => @account.to_json(:except => [:password]), :status => 200
}

но это мне нужно рефакторинг.

2 ответа

Решение

Если это только в одном действии, вы можете попробовать:

format.json { render :json => @account, :except => :password }

если вам это нужно для более чем одного действия, то переопределение будет лучше:

# Exclude password info from json output.
def to_json(options={})
  options[:except] ||= :password
  super
end 

то же самое хорошо для as_json

# Exclude password info from json output.
def as_json(options={})
  options[:except] ||= :password
  super
end

Лучшее решение - переопределить методы as_json в вашей модели следующим образом:

def as_json options={}
   super(
     include: {ADD THE RELATIONS YOU WANT TO INCLUDE}).merge({YOU CAN MERGE EXTRA PARAMETER HERE})
end

Вы можете использовать только (что означает, что будут возвращены только те параметры, которые вы перечислили) или использовать, кроме (что означает, что возвращаются все параметры, кроме перечисленных).

Другие вопросы по тегам