2015-09-09 3 views
5

Я пытаюсь разрешить запрос API указать, какие поля возвращать на объект. Я могу получить объект только с полей, указанных, но когда он сериализации, он выдает ошибку:Как можно активировать атрибут ActiveModel :: Serializer во время выполнения?

ActiveModel::MissingAttributeError (missing attribute: x) 

Как я могу достичь этой функциональности с ActiveModel::Serializer и возможно ли это?

ответ

1

Вы можете удалить атрибуты из сериализатора, но они должны существовать.

class SomeSerializer < ActiveModel::Serializer 
    attributes :something 

    def attributes 
    super.except(:something) if something 
    end 
end 
-1

Вы можете настроить атрибуты, применяя метод в вашем сериализаторе. Обратите внимание, что я описываю последние стабильные (на время написания этого сообщения) 0.9.x филиал.

class PostSerializer < ActiveModel::Serializer 
    attributes :id, :title, :body, :author 

    def filter(keys) 
    if scope.admin? 
     keys 
    else 
     keys - [:author] 
    end 
    end 
end 
+0

Не разрешает проблему, вызванную фильтрацией после поиска всех атрибутов, поэтому ошибка все равно возникает. – Adamantish

1

Это происходит потому, что метод Serializer.attributes называть каждое поле с помощью метода ActiveModel.read_attribute. Этот метод применит некоторые валидации, например validates_presence_of по определению модели, что вызовет исключение. Чтобы избежать этого я даю три плохим решением и после лучше и просто один:

  • Измените определения модели, но вы упустите проверку.
  • Перезапишите метод ActiveModel.read_attribute, чтобы справиться с этим поведением, вы получите новые проблемы.
  • Перезаписать Serializer.attributes и вместо того, чтобы позвонить super, позвоните по телефону object.attributes.

Но лучшим вариантом будет создание нового класса сериализации, чтобы избежать помимо эффектов, с единственными полями, которые вы хотите. Затем укажите это в классе контроллера:

render json: People.all.reduced, each_serializer: SimplePersonSerializer 

Edit 1

Правильный ответ должен быть один из Maurício Linhares.

render json: result.to_json(only: array_of_fields) 
+0

Окончательные предложения не отвечают требованиям. OP хочет, чтобы потребитель API мог указать любую комбинацию полей, а не определенное предопределенное подмножество. – Adamantish

+0

@ Adamantish спасибо за это, я не понимал, что он должен быть гибким, мой bad = ( – voiski

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

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