9

我们在 Rails 应用程序中使用active_model_serializers - 0.8.1 。

该应用程序具有一些从 ActionController::Metal 继承的 API 特定控制器,其方式类似于rails-apiActionController::API

好吧,我们只想将 ActiveModel::Serializers 用于上面提到的 API 控制器。
这可能吗,怎么做?

注意:
文档中所述,可以通过替换显式避免使用序列化程序

render :json

和:

render :json => @your_object.to_json

我们正在寻求一种比上述更优雅的解决方案。
谢谢。

4

7 回答 7

6

你也可以这样做:

respond_with @your_object, serializer: nil
于 2015-03-20T18:52:59.227 回答
4

您可以覆盖default_serializer_options控制器上的方法以禁用该控制器中所有操作的序列化程序。

def default_serializer_options
  {
    serializer: nil
  }
end

我们目前正在以其他方式生成 JSON,但我想调查ActiveModel::Serializers特定资源。这时我发现添加 g​​em 意味着所有控制器都将尝试使用序列化程序。不仅仅是我想测试该方法的那个。

默认情况下使用序列化器非常好,但我们需要一些时间来将现有控制器转换为这种方法。我更新了那些其他现有的控制器以不使用序列化程序(使用上述方法),因此我可以在逐个控制器的基础上添加序列化程序。

于 2016-03-29T23:02:43.197 回答
3

对于将来遇到这个问题的人,添加adapter: nilrender: json...will 工作(而不是serializer: nil

于 2019-11-14T10:22:50.377 回答
2

我遇到了一个还需要禁用序列化的问题,所以我创建了这个拉取请求,它增加了通过调用控制器来禁用特定控制器中的序列化的能力disable_serialization

于 2013-11-25T22:40:30.860 回答
1

我不知道是否有一个优雅的解决方案。看起来你必须猴子补丁 ActionController::Serialization - https://github.com/rails-api/active_model_serializers/blob/5a92e00b51927c9c0e7c90f92c825aff09314bfd/lib/action_controller/serialization.rb

最小的更改可能是通过覆盖build_json_serializer方法并在您不想使用 ActiveModelSerializers 的控制器中返回 nil。如果build_json_serializer在控制器中总是返回 nil,那么行为应该默认为非 AMS 序列化

不幸的是,这个类的结构似乎不适合修改(私有方法等),因此您可能需要提交拉取请求以使您的任务更容易。在包含 AMS 之前保留“原始”_render_option_json方法的别名,使build_json_serializer受保护而不是私有,或者添加配置选项以在每个控制器的基础上禁用 AMS 都是合理的修改。

于 2013-11-20T16:44:34.813 回答
1

请注意@dbj 的答案虽然正确,但由于 respond_with 已移动,因此在 Rails4 中不起作用。

NoMethodError:该respond_with特征已被提取到respondersgem。将其添加到您的 Gemfile 以继续使用此功能: gem 'responders', '~> 2.0' 请参阅 Rails 升级指南了解详细信息。

真正通过猜测找到的简单解决方法是:

render json: @you_object, serializer: nil

于 2016-08-11T19:04:31.237 回答
1

我知道这个问题有点老了,这里提供的解决方案已经过时了,只是想分享我的解决方案,让Netflix拥有ActiveModel::SerializersFastJsonApi

我制作的解决方案适用于ActiveModel::Serializers0.10。

# frozen_string_literal: true

class ApplicationController < ActionController::API

  private

  def _render_with_renderer_json(json, options)
    json = json.to_json(options) unless json.kind_of?(String)
    self.content_type ||= Mime[:json]
    json
  end
end

我刚刚恢复了 Ruby on Rails 5.x 的原始方法_render_with_renderer_jsonhttps://github.com/rails/rails/blob/5-2-stable/actionpack/lib/action_controller/metal/renderers.rb#L156-L169) .

于 2018-06-13T03:22:51.937 回答