繁体   English   中英

Ruby on Rails 3 - to_json不包括所有属性

[英]Ruby on Rails 3 - to_json not including all attributes

我正在我的模型对象上使用to_json方法,我通过执行以下操作来创建:

user = User.find(1)

当我做user.to_json ,很多属性的缺失,包括user.id从编码的JSON字符串。 看来我从User模型添加为attr_accessible的所有属性都存在,但没有其他属性。 也许这就是to_json正在做的事情,但我认为在attr_accessible中添加id是不行的。

解决这个问题的正确方法是什么?

UPDATE

这看起来是Devise的一个特定问题。 如果我从user.rb注释掉以下内容,一切都按预期工作:

devise :rememberable, :trackable, :token_authenticatable, :omniauthable

我没有检查,但我相信Devise为你做了这件事; 它仅通过attr_accessible包含某些属性。

在任何情况下,解决此问题的正确方法是覆盖as_json方法,如下所示:

def as_json(options = nil)
  {
    my_attr: my_attr,
    etc: etc
  }
end

这是一个简单的哈希,它是一种非常强大的方法,可以在AR中生成JSON,而不会弄乱to_json方法。

默认情况下,Devise会覆盖serializable_hash方法以仅公开可访问的属性(因此,在APIs上默认情况下,encrypted_pa​​ssword不会被序列化)。

您可以尝试覆盖此方法并将auth_token添加到哈希,如下所示:

def serializable_hash(options = nil)super(options).merge(“auth_token”=> auth_token)end

正如凯恩所提到的,设计确实为你过滤了属性。 然而,我宁愿只是追加我需要的东西,而不是覆盖Devise的逻辑。

相反,我宁愿这样做

def as_json(options={})
  json_res = super options
  json_res['locked_at'] = self.locked_at
  json_res['confirmed_at'] = self.confirmed_at
end

或者您的用户可能拥有的任何其他属性

如果你像我一样来这里寻找Rails 4,这里有一些有用的信息。

正如Alan David Garcia上面所说,Devise会覆盖serializable_hash 要强制覆盖,您可以执行以下操作,例如,在调用Model#as_json时返回除password_digest之外的所有属性。

def as_json(options = {})
  options[:force_except] ||= [:password_digest]
  super(options)
end

您可以在options[:force_except]指定要排除的任何所需模型属性,而不仅仅是:password_digest

在您的模型类中包含类似的内容:

  attr_accessible :id, :email, :password, :password_confirmation, :remember_me

最初这个id没有包含在json中,但是在我将它添加到attr_accessible后它才起作用!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM