2014-11-18 3 views
0

Я просмотрел всю активную модель serializer (v 0.9.0) и вопросы, которые я могу найти, но не могу понять это.Как пропустить объект в массиве Serializer ActiveModel?

У меня есть объекты, которые могут быть помечены как «опубликованные» или «черновики». Когда они не публикуются, только пользователь, создавший объект, должен уметь его видеть. Я могу, очевидно, установить разрешения для «show» в моем контроллере, но я также хочу удалить эти объекты из json, чтобы мои действия «index» вернулись, если это не правильный пользователь. Есть ли способ полностью удалить этот объект из json, возвращаемого сериализатором?

В моем сериализаторе activemodel я могу использовать пользовательский фильтр (ключи) и перегруженные атрибуты для удаления данных, как показано в моем коде ниже, но я не могу просто удалить весь объект (мне осталось return empty {} в моем json, пытаясь вернуть nil, разрывает сериализатор).

Возможно, я пропустил что-то простое. Любая помощь приветствуется!

class CompleteExampleSerializer < ExampleSerializer 

    attributes :id, :title 
    has_many :children 

    def attributes 
    data = super 
    (object.published? || object.user == scope || scope.admin?) ? data : {} 
    end 

    def filter(keys) 
    keys = super 
    (object.published? || object.user == scope || scope.admin?) ? keys : {} 
    end 
end 
+0

Вы когда-нибудь это выясняли? У меня точно такая же проблема! Я думаю, что решение может состоять в том, чтобы пропустить его в сериализаторе массива. Еще слишком рано, чтобы мои руки были грязными, хотя я собираюсь дать ему еще час, чтобы набраться мужества. – CleoR

+0

Idt, который будет работать, если эта ассоциация включена в другой сериализованный объект. Вы должны были бы сказать, чтобы использовать ваш специальный сериализатор в каждом другом сериализаторе. Было бы намного проще, если бы вы могли указать сериализатор массива из сериализатора объектов. – CleoR

+0

Я не могу заставить фильтр работать. Я могу просто разделить главы на опубликованные и неопубликованные и создать метод для каждого из модели. Таким образом, я могу использовать все или ничего в сериализаторе. Дайте мне знать, если вы найдете лучший подход. – CleoR

ответ

0

Это выглядит правильно, попробуйте вернуть массив вместо хэша, когда вы не хотите никаких ключей. Кроме того, я не думаю, что вызов супер необходим b/c фильтр принимает ключи.

Кроме того, я не думаю, что определение метода атрибутов необходимо.

0

У меня есть главы, которые могут быть опубликованы или опубликованы. Они принадлежат истории, поэтому я закончил делать что-то вроде ниже.

has_many :unpublished_chapters, -> { where published: false }, :class_name => "Chapter", dependent: :destroy 
has_many :published_chapters, -> { where published: true }, :class_name => "Chapter", dependent: :destroy 

Внутри моего сериализатором, я выбираю включить unpublished_chapters только если current_user является владельцем этих глав. В ams 0.8.0 синтаксис подобен этому.

def include_associations! 
    include! :published_chapters if ::Authorization::Story.include_published_chapters?(current_user,object,@options) 
    include! :unpublished_chapters if ::Authorization::Story.include_unpublished_chapters?(current_user,object,@options) 
end 

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

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