尝试升级 Rails 依赖项会导致序列化程序引发错误:Hash:Clas 的未定义方法“model_name”

The*_*bio 6 serialization json ruby-on-rails active-model-serializers

几个月前,我已将已建立的 Rails 应用程序上的 Rails 升级到 5.2.4.2,并进行了最少的 Rails 依赖升级;该应用程序再次稳定下来,因此我们决定将所有 Rails 依赖项升级到最新的兼容版本。

现在,只要控制器对简单(非数据库模型)类进行 json 渲染调用,就会显示错误消息。

例子

这是序列化器:

class Api::MessageResponseSerializer < ApplicationSerializer
  self.version = 1

  attributes :message, :changes

  def message
    self.object[:message]
  end

  def changes
    self.object[:changes]
  end
end
Run Code Online (Sandbox Code Playgroud)

呼叫

render :json => { :message => "Not Ready Yet"}, :serializer => Api::MessageResponseSerializer
Run Code Online (Sandbox Code Playgroud)

我收到错误:

NoMethodError:
       undefined method `model_name' for Hash:Class
Run Code Online (Sandbox Code Playgroud)

呼叫

render :json => [{ :message => "Not Ready Yet"}], :serializer => Api::MessageResponseSerializer
Run Code Online (Sandbox Code Playgroud)

我收到错误:

 NoMethodError:
       undefined method `model_name' for Array:Class

Run Code Online (Sandbox Code Playgroud)

调用(我知道这个不是正确的json,它在这里只是为了举例说明发生相同的错误)

render :json => 1, :serializer => Api::MessageResponseSerializer
Run Code Online (Sandbox Code Playgroud)

我收到错误:

NoMethodError:
       undefined method `model_name' for Integer:Class
Run Code Online (Sandbox Code Playgroud)

我可以对这些类进行猴子修补,但我宁愿有一个解决方案来允许序列化器从这些简单的类中获取 model_name 。

The*_*bio 4

似乎对 JSON 序列化有一个硬性要求,作为版本 0.10.10 上的active_model_serializers gem 的一部分引入(通过捆绑升级自动设置);

我将这个 gem 降级到版本 0.10.9 并且序列化问题不再发生......

  • 但 0.10.9 不支持 Rails 6。您能在 Rails 6 中找到解决方案吗? (2认同)