2015-03-27 2 views
3

У меня есть простой вопрос. У меня есть seriaizer, который выглядит следующим образом:Как вернуть все атрибуты объекта с помощью Rails Serializer?

class GroupSerializer < ActiveModel::Serializer 
    attributes :id, :name, :about, :city 
end 

Проблема заключается в том, что всякий раз, когда я изменить свою модель, я должен добавить/удалить атрибуты из этого сериализатора. Я просто хочу получить весь объект по умолчанию, как в стандартных рельсах json:

render json: @group 

Как это сделать?

+0

Можете ли вы сказать о более .. в чем проблема. Вы имели в виду, что вы не хотите ставить имена атрибутов _manually_, как это: 'attributes: id,: name,: about,: city'? –

+0

есть, точно. Я просто хочу, чтобы весь объект возвращался по умолчанию. Я также хочу исключить вещи, если это необходимо. –

ответ

11

По крайней мере, на 0,8. 2 из ActiveModelSerializers вы можете использовать следующее:

class GroupSerializer < ActiveModel::Serializer 
    def attributes 
    object.attributes.symbolize_keys 
    end 
end 

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

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

================================================================================================================================== ==============

UPDATE: 01/12/2016

на 0.10.x версия ActiveModelSerializers, атрибуты принимает два аргумента по умолчанию. Я добавил * арг, чтобы избежать исключения:

class GroupSerializer < ActiveModel::Serializer 
    def attributes(*args) 
    object.attributes.symbolize_keys 
    end 
end 
0

Попробуйте сделать следующее, чтобы получить все ключи атрибутов для Group класса:

Group.new.attributes.keys 

Например, я получаю следующее для пользователей на одно приложение:

> User.new.attributes.keys 
=> ["id", "password_digest", "auth_token", "password_reset_token", "password_reset_requested_at", "created_at", "updated_at"] 
1

Просто, чтобы добавить к @ Кевин ответ. Я также рассматривал, как добавлять фильтры в возвращаемые атрибуты. Я посмотрел на документацию active_model_serializers 0.9 и он поддерживает фильтры, выглядит следующим образом:

def attributes 
    object.attributes.symbolize_keys 
    end 
    def filter(keys) 
      keys - [:author, :id] 
    end 

Я пробовал, но это не сработало. Я предположил, что это потому, что атрибуты не указаны явно. Я должен был сделать это таким же образом, указанный в rails cast работать:

@@except=[:author, :id] 
def attributes 
    data = object.attributes.symbolize_keys 
    @@except.each { |e| data.delete e } 
    data 
end 
0

На 0.10.x версии ActiveModelSerializers, атрибуты принимает два аргумента по умолчанию. Я добавил * арг, чтобы избежать исключения:

class GroupSerializer < ActiveModel::Serializer 
    def attributes(*args) 
    object.attributes.symbolize_keys 
    end 
end