【问题标题】:Ruby on Rails 3 - to_json not including all attributesRuby on Rails 3 - to_json 不包括所有属性
【发布时间】:2011-07-28 22:21:46
【问题描述】:

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

user = User.find(1)

当我执行 user.to_json 时,很多属性都丢失了,包括编码 JSON 字符串中的 user.id。我从 User 模型中添加为 attr_accessible 的所有属性似乎都在那里,但其他属性都没有。也许这就是 to_json 正在做的事情,但我认为将 id 添加到 attr_accessible 是不行的。

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

更新

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

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

【问题讨论】:

  • 这真的很奇怪......如果你明确输入user.to_json(:except => :created_at)
  • 您尝试从控制台工作吗? to_json 之前的对象呢?是否设置了所有属性?
  • 对象确实在 to_json 之前包含 id(在控制台中验证)。我试过 (:except => :created_at) 并没有这样做。我想知道 Devise 是否对我的对象做了一些奇怪的事情。

标签: ruby-on-rails json ruby-on-rails-3 devise


【解决方案1】:

我还没有检查过,但我相信 Devise 会为您做到这一点;它仅通过 attr_accessible 包含某些属性。

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

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

这是一个简单的哈希,是一种在 AR 中生成 JSON 的非常强大的方法,而且不会与 to_json 方法混淆。

【讨论】:

    【解决方案2】:

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

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

    def serializable_hash(options = nil) 超级(选项).merge(“auth_token”=> auth_token) 结束

    【讨论】:

      【解决方案3】:

      Devise 确实为您过滤了属性,正如 kain 所提到的。 不过,我宁愿只添加我需要的内容,而不是覆盖 Devise 的逻辑。

      相反,我宁愿这样做

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

      或您的用户可能拥有的任何其他您想要传递的属性

      【讨论】:

        【解决方案4】:

        如果您像我一样来这里寻找 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

        【讨论】:

          【解决方案5】:

          在你的模型类中包含这样的东西:

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

          最初 id 不包含在 json 中,但是在我将它添加到 attr_accessible 之后它就起作用了!!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多