Ruby on Rails 3 - to_json, не включая все атрибуты - PullRequest
14 голосов
/ 29 июля 2011

Я использую метод to_json для моего объекта модели, который я создал, выполняя что-то вроде:

user = User.find(1)

Когда я делаю user.to_json, многие атрибуты отсутствуют, включая user.id из закодированной строки JSON. Похоже, что все атрибуты, которые я добавил как attr_accessible из модели User, есть, но нет других. Возможно, это то, что делает to_json, но я думаю, что добавление id в attr_accessible не стоит.

Как правильно решить эту проблему?

ОБНОВЛЕНИЕ

Это похоже на конкретную проблему с Devise. Если я закомментирую следующее из user.rb, все будет работать как положено:

devise :rememberable, :trackable, :token_authenticatable, :omniauthable

Ответы [ 5 ]

5 голосов
/ 29 июля 2011

Я не проверял, но я верю, что Devise сделает это для вас; он включает только определенные атрибуты через attr_accessible.

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

def as_json(options = nil)
  {
    my_attr: my_attr,
    etc: etc
  }
end

Это простой хеш, и это действительно мощный метод для генерации JSON в AR без использования метода to_json.

2 голосов
/ 23 июня 2016

Если вы пришли сюда в поисках Rails 4, как я, вот некоторая информация, которая поможет.

Как сказал Алан Дэвид Гарсия выше, Devise переопределяет serializable_hash.Чтобы вызвать переопределение, вы можете сделать следующее, например, чтобы вернуть все атрибуты, кроме password_digest при вызове Model#as_json.

def as_json(options = {})
  options[:force_except] ||= [:password_digest]
  super(options)
end

Вы можете указать любые атрибуты модели, которые нужно исключить в options[:force_except]вместо просто :password_digest.

2 голосов
/ 02 октября 2015

Devise действительно фильтрует атрибуты для вас, как упомянуто Каином.Тем не менее, я бы предпочел просто добавить именно то, что мне нужно, вместо того, чтобы переопределять логику Devise.

Вместо этого я бы предпочел сделать

def as_json(options={})
  json_res = super options
  json_res['locked_at'] = self.locked_at
  json_res['confirmed_at'] = self.confirmed_at
end

или любые другие атрибуты, которые может иметь этот пользователь.Вы хотите пройти

2 голосов
/ 09 мая 2014

По умолчанию Devise переопределяет метод serializable_hash для предоставления только доступных атрибутов (поэтому такие вещи, как encrypted_password, по умолчанию не сериализуются в API).

Вы можете попробовать переопределить этот метод и добавить auth_token в хеш, что-то вроде этого:

def serializable_hash (options = nil) супер (параметры) .merge ("auth_token" => auth_token) конец

0 голосов
/ 01 февраля 2012

включите что-то подобное в класс вашей модели:

  attr_accessible :id, :email, :password, :password_confirmation, :remember_me

Изначально идентификатор не был включен в json, но после того, как я добавил его в attr_accessible, он заработал !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...