我们在Rails应用程序中使用active_model_serializers - 0.8.1。
该应用程序有一些特定于API的控制器继承自ActionController :: Metal,其方式类似于rails-api的ActionController::API。
我们只想将ActiveModel :: Serializers用于上面提到的API控制器 这可能吗,怎么样?
注意:
如documentation中所述,可以通过替换
render :json
with:
render :json => @your_object.to_json
我们正在寻求比上述解决方案更优雅的解决方案 感谢。
答案 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::Serializers和FastJsonApi
我制作的解决方案适用于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
)会有用