是否可以在 Rails 控制器之外使用 ActiveModel::Serializers?

Posted

技术标签:

【中文标题】是否可以在 Rails 控制器之外使用 ActiveModel::Serializers?【英文标题】:Is it possible to use ActiveModel::Serializers outside of Rails controller? 【发布时间】:2015-03-24 14:26:11 【问题描述】:

我将websocket-rails gem 用于网络套接字,我想使用 ActiveModel::Serializers 为网络套接字消息创建 JSON 有效负载。 是否可以在控制器中不使用render 的情况下使用序列化程序?

【问题讨论】:

我可以通过显式实例化序列化器来做到这一点:ConversationSerializer.new(Conversation.last).as_json 但我仍然想不出序列化集合的方法 哦,知道了:ActiveModel::ArraySerializer.new(Conversation.all, serializer: ConversationSerializer).as_json 【参考方案1】:

查看源代码后,我找到了我正在寻找的答案。 您可以通过显式实例化序列化程序来使用 AMS:ConversationSerializer.new(Conversation.last).as_json

收集: ActiveModel::Serializer::CollectionSerializer.new(Conversation.all, serializer: ConversationSerializer).as_json

【讨论】:

在 0.10 版中,此类已被移动/重命名为:ActiveModel::Serializer::CollectionSerializer【参考方案2】:

是的,有可能。

假设您有一个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"

【讨论】:

这仅适用于p 表示Product 的单个实例(例如Product.first)

以上是关于是否可以在 Rails 控制器之外使用 ActiveModel::Serializers?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取模型中图像变体的 url(在控制器/视图之外)?主动存储

Rails - CanCanCan - 常用能力

如何要求在 Rails 之外工作的活动记录

是否可以控制 Rails 读取 .CSS 文件的顺序,还是按惯例固定?

Rails:如何使用 Rails 控制台列出数据库表/对象?

Rails 控制器检查 Turbolinks 是不是请求