Ruby on rails RubyonRails3-to_json不包括所有属性

Ruby on rails RubyonRails3-to_json不包括所有属性,ruby-on-rails,json,ruby-on-rails-3,devise,Ruby On Rails,Json,Ruby On Rails 3,Devise,我正在对我的模型对象使用to_json方法,该对象是通过以下操作创建的: user=user.find(1) 当我执行user.to_json时,许多属性丢失,包括编码的json字符串中的user.id。似乎我添加的所有属性都可以从用户模型访问,但其他属性都没有。也许这就是json所做的,但我认为向attr\u accessible添加id是不可能的 解决这个问题的正确方法是什么 更新 这似乎是Desive的一个具体问题。如果我从user.rb中注释掉以下内容,则一切都会按预期进行: desig

我正在对我的模型对象使用
to_json
方法,该对象是通过以下操作创建的:

user=user.find(1)

当我执行
user.to_json
时,许多属性丢失,包括编码的json字符串中的
user.id
。似乎我添加的所有属性都可以从用户模型访问,但其他属性都没有。也许这就是json所做的,但我认为向attr\u accessible添加
id
是不可能的

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

更新

这似乎是Desive的一个具体问题。如果我从user.rb中注释掉以下内容,则一切都会按预期进行:


designe:memberable,:trackable,:token\u authenticable,:omniauthable
我还没有检查过,但我相信designe会为你做这件事;它仅包括通过属性访问的某些属性

无论如何,解决这个问题的正确方法是重写
as\u json
方法,如下所示:

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

这是一个简单的散列,它是在AR中生成JSON的一个非常强大的方法,而不会干扰
to_JSON
方法。

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

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

最初,这个id没有包含在json中,但在我将它添加到attr_accessible之后,它就工作了

默认情况下,designe会覆盖serializable_hash方法,以仅公开可访问的属性(因此加密的_密码之类的内容在默认情况下不会在API上序列化)

您可以尝试重写此方法,并将auth_标记添加到哈希中,如下所示:

def序列化_散列(选项=nil) 超级(选项)。合并(“身份验证令牌”=>身份验证令牌)
end

正如kain所提到的,designe确实为您过滤属性。 尽管如此,我还是更愿意准确地附加我需要的内容,而不是覆盖Desive的逻辑

相反,我宁愿这样做

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)在上文中所说,设计覆盖
可序列化的\u散列
。要强制覆盖,您可以执行以下操作,例如,在调用
Model\as\u json
时返回除
password\u digest
之外的所有属性

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

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

这真是奇怪。。。如果您显式地键入
user.to_json(:except=>:created_at)
,会怎么样?您是否尝试从控制台工作?那之前的对象呢?它是否设置了所有属性?该对象在to_json(在控制台中验证)之前确实包含id。我尝试了(:except=>:created_at),但没有成功。我不知道Deave是否对我的目标做了一些奇怪的事情。