2016-06-26 4 views
2

Я обновляю драгоценный камень active_model_serializers с версии 0.9.5 до 0.10.1. Для версии 0.9.5 приведен код ниже.ActiveModelSerializers gem: как передать параметр в serializer

Контроллер:

def create 
    ... 
    render json: @dia, app_rights: app_rights(@dia) 
end 

Serializer:

class Api::V1::SerializerWithSessionMetadata < ActiveModel::Serializer 
    attributes :app_rights 
    def app_rights 
    serialization_options[:app_rights] 
    end 
end 

Метод serialization_options устарел в версии 0.10.1.

  • Here предлагается использовать instance_options вместо.
  • Here предлагается использовать options: «instance_options доступен только в основной ветке, а не в текущем RC. В текущем RC вам нужно использовать опции».
  • Есть также предложения для @options и @instance_options.

Я попытался заменить serialization_options со всеми перечисленными выше вариантами. Тем не менее, во всех случаях, после обновления драгоценного камня, json производства не включает app_rights. Что я делаю не так?

+0

Какие рельсы и рубиновая версия вы используете? в соответствии с поддержкой изменений в Rails 4.0 и рубине 2.0.0. – niceman

+0

Использование последних версий: ruby ​​2.3.1 и rails 4.2.6 – Marty

+0

hmmm интересно, что они говорят, что 0.10.x не обратно совместим с 0,9 или 0,8, может быть, файл ошибка «пропавшего руководства по миграции»? – niceman

ответ

4

Использование instance_options, ваш сериализатору должен выглядеть следующим образом:

class Api::V1::SerializerWithSessionMetadata < ActiveModel::Serializer 
    attributes :app_rights 
    def app_rights 
     @instance_options[:app_rights] 
    end 
end 

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

render json: @dia, serializer: SerializerWithSessionMetadata, app_rights: app_rights(@dia) 
+0

Спасибо, указав сериализатор, он работает (оказывается, я сейчас необходимо указывать сериализатор повсюду в приложении, а не только для приведенного выше примера). Это действительно странно, и по возможности я хотел бы узнать, почему это так. Это то, что я узнал: с новой версией gem, если я не укажу сериализатор в контроллере, он по-прежнему автоматически использует сериализатор RIGHT, но не сериализует атрибуты, которые вычисляются внутри метода в сериализаторе , Другими словами, он только сериализует атрибуты, которые он может непосредственно читать из базы данных. Есть идеи об этом? – Marty

+0

Если AMS не находит нужный сериализатор, он просто превращает объект в json, который будет читать только атрибуты DB. AMS автоматически свяжет правильный сериализатор только в том случае, если вы назвали ваш сериализатор класса MyObjectSerializer, если @dia является MyObject. – johnstoecker

 Смежные вопросы

  • Нет связанных вопросов^_^