Изменение полей, включенных в стандартную сериализацию JSON / XML для Rails - PullRequest
2 голосов
/ 26 августа 2011

Я пишу веб-сервис для возврата информации о пользователе.В контроллере я просто render :xml => user and return.Однако возвращаются не все поля моей модели User, и я не вижу в моей модели ничего, что указывало бы, какие поля включать или исключать.

Модель:

class User < ActiveRecord::Base
  devise :database_authenticatable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :first_name, :last_name
end

Пример:

irb(main):003:0> @user = User.find(3)
=> #<User id: 3, email: "me@me.me", encrypted_password: <redacted>, reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 11, current_sign_in_at: "2011-08-24 22:50:44", last_sign_in_at: "2011-08-24 06:18:41", current_sign_in_ip: "1.2.3.4", last_sign_in_ip: "1.2.3.4", created_at: "2011-08-23 17:09:28", updated_at: "2011-08-26 04:01:01", controller: false, admin: false, chargify_customer_id: 1234, chargify_subscription_id: 1234, first_name: "Me", last_name: "Me", chargify_subscription_state: "active">

Что мой render в настоящее время возвращает для этого же пользователя:

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <last-name>Me</last-name>
  <email>me@me.me</email>
  <first-name>Me</first-name>
</user>

Как минимум, мне нужно включить поле id;В целом, я бы хотел лучше понять, как вы контролируете, что входит, а что нет.

1 Ответ

4 голосов
/ 26 августа 2011

Сериализация происходит в методах as_json/as_xml.По умолчанию эти методы сериализуют все ваши атрибуты моделей в json / xml.Однако devise скрывает определенные атрибуты, созданные его расширениями ActiveRecord.Вот почему вы не получаете поля пароля, например.

Вы можете контролировать, какие атрибуты будут включены в ваш XML, переопределив метод to_xml в вашей пользовательской модели.

  def as_xml(options = {})
    default_options = {
      :only => [:id, :first_name, :last_name, :email]
    }
    xml_options = options.blank? ? default_options : options
    super xml_options
  end

также включите пользовательские методы вашей модели.

  def as_xml(options = {})
    default_options = {
      :only => [:id, :first_name, :last_name, :email],
      :methods => [:some_custom_method]
    }
    xml_options = options.blank? ? default_options : options
    super xml_options
  end

Подробнее о сериализации вы можете прочитать здесь: http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html

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