nil的未定义方法`keys':在任意类实例上调用to_json时为NilClass

时间:2016-05-04 07:13:24

标签: json ruby-on-rails-4 active-model-serializers

我有以下定义的课程

runtime: custom
vm: true
entrypoint: bundle exec rackup -p 8080 -E production config.ru
resources:
  cpu: 0.5
  memory_gb: 1.3
  disk_size_gb: 10

env_variables:
  GCLOUD_STORAGE_BUCKET: site-1286.appspot.com

当我尝试拨打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 中设置meta,则不会出错。此外,如果我使用活动记录实例设置post,它也可以正常工作。

有人可以提出我在上述课程中缺少的内容吗?

1 个答案:

答案 0 :(得分:0)

我明白了。

PostMetaattribute_accessor定义了description,但attributes方法返回的哈希值丢失了。

我也进行了一些重构,所以如果attributes列表更改,我不必担心添加/删除attributes_accessor哈希属性。

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