Как переопределить метод "as json" или "to json", чтобы "ответить" без включения указанной информации?

Я использую 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

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