在任意 class 实例上调用 to_json 时 nil:NilClass 的未定义方法“键”

undefined method `keys' for nil:NilClass while calling to_json on arbitrary class instance

我有以下类定义

class Post
  include ActiveModel::Serializers::JSON

  attr_accessor :id,
                :title,
                :status,
                :meta
  def attributes
    { 'id' => nil, 'title' => nil, 'status' => nil, 'meta' => nil }
  end
end


class PostMeta
  include ActiveModel::Serializers::JSON

  attr_accessor :id,
                :key,
                :value,
                :description

  def attributes
    { 'id' => nil, 'key' => nil, 'value' => nil }
  end
end

当我尝试调用 to_json 时,它给出了上述错误。这是我如何设置数据

post = Post.new
post.id = 1
post.title = 'test'
post.status = 0

meta = PostMeta.new
meta.id = 8
meta.key = 'cloud'
meta.value = 'wpengine'

post.meta = meta

post.to_json

如果我没有在 post 中设置 meta 那么它就不会给出错误。此外,如果我使用活动记录实例设置 meta,它也可以正常工作。

任何人都可以提出我在上面缺少的内容 类 吗?

我想通了。

PostMeta 已为 description 定义了 attribute_accessor,但在 attributes 方法返回的散列中丢失。

我还进行了一些重构,因此如果 attributes_accessor 列表发生变化,我不必担心 adding/removing 属性到 attributes 哈希。

class Base
  include ActiveModel::Serializers::JSON

  def attributes
    @attributes ||= Hash[self.class::ATTRIBUTES.map(&:to_s).zip]
  end
end

class Post < Base
  ATTRIBUTES = [:id, :title, :status, :meta]
  attr_accessor *ATTRIBUTES

end


class PostMeta < Base
  ATTRIBUTES = [:id, :key, :value, description]
  attr_accessor *ATTRIBUTES
end