覆盖JSON哈希

时间:2015-06-11 08:22:41

标签: ruby-on-rails json ruby-on-rails-4

以下是上下文:我有一个模型和一个控制器,就像这样(非常简化,仅用于示例):

class Model < ActiveRecord::Base
  def to_json(options = {})
    return super({ :except => [ :id ] })
  end
end

class ModelsController < ApplicationController
  def show
    return @contact.to_json
  end
  def some_action
    return { "foo" => @contact }.to_json
  end
end

当我调用show操作时,调用了Model的{​​{1}}操作,并且我有一个没有to_json的json:

id

当我调用 {"first_name":"Vincent",[...]} 操作时,结果如下所示:

some_action

怎么能有这个回应?

 {"foo": "<Model:0x000000048c7388>"}

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我建议使用序列化程序库,例如ActiveModel::Serializers

gem 'active_model_serializers', '~> 0.9.3'

请注意版本!然后创建包含

/app/serializers/contact_serializer.rb
class ContactSerializer < ActiveModel::Serializer
  attributes :first_name
end

然后在你的控制器中,它就像

一样简单
class ContactsController < ApplicationController
  def show
    render json: @contact, root: false
  end

  def some_action
    render json: @contact, root: 'foo'
  end
end

响应将是

# show
{"first_name": "..."}

# some_action
{"foo": {"first_name": "..."}}

答案 2 :(得分:0)

在这种情况下,最好的方法是重新定义模型中的serializable_hash,这样使用as_json方法,它将返回一个带有serialazable_hash方法中定义的json。像这样:

  class Model < ActiveRecord::Base
    def serialazable_hash(options = {})
        options ||= {}
        options = {
          except: [:id]
        }.update(options)
        super options
    end
  end