在任意 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
我有以下类定义
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