Использование ActiveModel::Serializer в Rails — данные JSON различаются между json и индексным ответом

Я использую гем active_model_serializers для управления данными сериализации и наблюдаю странное поведение. Мой код выглядит так:

модель и сериализатор

class User
  include Mongoid::Document
  field :first_name, :type => String
  field :last_name,  :type => String

  def full_name
    first_name + " " + last_name
  end
end

class UserSerializer < ActiveModel::Serializer
  attributes :id, :first_name, :last_name, :full_name
end

контроллер

class UsersController < ApplicationController
  respond_to :json, :html

  def index
    @users = User.all
    respond_with @users
  end
end

представление (приложение/представления/пользователи/index.html.erb)

...
<script type="text/javascript">
  $(function(){
    // using a backbone collection to manage data
    App.users = new App.Collections.Users(<%= @users.to_json.html_sage %>);
  });
</script>

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

{
  "id": 2,
  "first_name": "John",
  "last_name": "Doe"
}

Когда я получаю доступ к /users.json (у меня есть resources :users в моем файле routes.rb), я вижу правильный JSON:

{
  "id": 2,
  "first_name": "John",
  "last_name": "Doe",
  "full_name": "Jonn Doe"
}

Я не мог понять, что я могу делать неправильно - любой вклад поможет. Благодарю.


person sa125    schedule 13.11.2012    source источник
comment
Пожалуйста, отмечайте языки, которые вы использовали, вместо бесполезных тегов, таких как mismtach - на этот раз я сделал это за вас.   -  person Chris Laplante    schedule 13.11.2012
comment
Нет проблем - просто дружеское напоминание :) Это улучшит окраску синтаксиса и привлечет больше внимания.   -  person Chris Laplante    schedule 13.11.2012
comment
Еще нет. Если у вас есть что-то, пожалуйста, дайте мне знать.   -  person sa125    schedule 29.11.2012


Ответы (2)


Вы не используете свой сериализатор в представлении HTML. Попробуй это:

App.users = new App.Collections.Users(<%= UserSerializer.new(@users).to_json.html_safe %>);

Причина этого в том, что сериализатор подхватывается в методе respond_with, сериализатор делает не перезаписывать ваш метод .to_json.

person harm    schedule 11.12.2012
comment
У меня та же проблема, но когда я применил ваше решение, оно выдало исключение, говорящее о неопределенном методе `read_attribute_for_serialization' для #‹ActiveRecord::Relation:0x007fdb18ea4ef8›. Это из-за версий драгоценных камней. Я использую драгоценные камни AMS 0.7.0 и json 1.7.7. - person Gagan; 21.04.2013
comment
@Gagan У меня была та же проблема с отсутствующим read_attribute_for_serialization (обратите внимание, я не использую Mongoid, но не сохраняю ActiveModel), мне пришлось добавить это в свой класс: включить ActiveModel::Serialization. Это помогло. - person mcginniwa; 19.06.2013
comment
Помимо добавления включения ActiveModel::Serialization, я должен был убедиться в том, что в моем файле гема я использую 0.8.1 гема AMS 'active_model_serializers', '~› 0.8.1' - person MrMattWright; 14.05.2014

@Gagan это работает для меня:

App.users = new App.Collections.Users(<%= ActiveModel::ArraySerializer.new(@users).to_json.html_safe %>);

person cache.zero    schedule 02.06.2013