Можно ли использовать ActiveModel::Serializers вне контроллера Rails?

Я использую websocket-rails gem для веб-сокетов, и я хотел бы использовать ActiveModel::Serializers для создания полезной нагрузки JSON для сообщения веб-сокета. Можно ли использовать сериализатор без использования render в контроллере?


person Anatoliy Kukul    schedule 24.03.2015    source источник
comment
Я могу сделать это, явно создав сериализатор: ConversationSerializer.new(Conversation.last).as_json   -  person Anatoliy Kukul    schedule 24.03.2015
comment
Но я до сих пор не могу понять, как сериализовать коллекцию   -  person Anatoliy Kukul    schedule 24.03.2015
comment
о, понял: ActiveModel::ArraySerializer.new(Conversation.all, serializer: ConversationSerializer).as_json   -  person Anatoliy Kukul    schedule 24.03.2015


Ответы (2)


Изучив исходный код, я нашел ответ, который искал. Вы можете использовать AMS, явно создав сериализатор: ConversationSerializer.new(Conversation.last).as_json

для коллекции: ActiveModel::Serializer::CollectionSerializer.new(Conversation.all, serializer: ConversationSerializer).as_json

person Anatoliy Kukul    schedule 24.03.2015
comment
Этот класс был перемещен/переименован в: ActiveModel::Serializer::CollectionSerializer в версии 0.10. - person Shaun; 11.05.2016

Да, это возможно.

Допустим, у вас есть модель Product и запись p:

# p = Product.first
ProductSerializer.new(p).to_json

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

require "action_controller"
require "action_controller/serialization"
require "#{Rails.root}/app/serializers/product_serializer.rb"
person Daniel Loureiro    schedule 24.03.2015
comment
Это работает, только если p представляет один экземпляр Product (например, Product.first) - person Daniel Bonnell; 19.01.2017