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

Dim*_*bas 9 ruby ruby-on-rails rails-api active-model-serializers

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

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

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

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

render :json

有:

render :json => @your_object.to_json

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

man*_*.vu 6

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


小智 5

你也可以这样做:

respond_with @your_object, serializer: nil
Run Code Online (Sandbox Code Playgroud)

  • 似乎语法已经改变:https://github.com/rails-api/active_model_serializers/issues/2221 (2认同)

Kyl*_*lle 5

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

def default_serializer_options
  {
    serializer: nil
  }
end
Run Code Online (Sandbox Code Playgroud)

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

默认情况下使用序列化器是很好的选择,但我们需要一些时间将现有控制器过渡到这种方法。我更新了其他现有控制器以不使用序列化器(使用上述方法),因此我可以在逐个控制器的基础上添加序列化器。


Pet*_*ein 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 都是合理的修改。