如何为特定控制器禁用ActiveModel :: Serializers?

时间:2013-11-20 16:18:15

标签: ruby-on-rails ruby active-model-serializers rails-api

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

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

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

注意:
documentation中所述,可以通过替换

明确避免使用序列化程序

render :json

with:

render :json => @your_object.to_json

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

7 个答案:

答案 0 :(得分:5)

你也可以这样做:

respond_with @your_object, serializer: nil

答案 1 :(得分:4)

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

def default_serializer_options
  {
    serializer: nil
  }
end

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

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

答案 2 :(得分:2)

我遇到了一个也需要禁用序列化的问题,因此我创建了this pull request,通过调用控制器中的disable_serialization,增加了在特定控制器中禁用序列化的功能。

答案 3 :(得分:1)

我不知道是否有一个优雅的解决方案。看起来你需要monkeypatch 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都将是合理的修改

答案 4 :(得分:1)

只是提醒@ dbj的回答,虽然正确,但由于respond_with已被移动,因此无法在Rails4中运行。

  

NoMethodError:respond_with功能已被提取到responders gem。将其添加到您的Gemfile以继续使用此功能:     宝石'响应者','〜> 2.0'   有关详细信息,请参阅Rails升级指南。

通过猜测真正找到的简单修复就是:

render json: @you_object, serializer: nil

答案 5 :(得分:1)

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

我制作的解决方案适用于ActiveModel::Serializers 0.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(https://github.com/rails/rails/blob/5-2-stable/actionpack/lib/action_controller/metal/renderers.rb#L156-L169)的原始方法_render_with_renderer_json

答案 6 :(得分:0)

对于将来遇到此问题的人,将adapter: nil添加到render: json...(而不是serializer: nil)会有用