以下是上下文:我有一个模型和一个控制器,就像这样(非常简化,仅用于示例):
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>"}
答案 0 :(得分:0)
使用as_json
代替to_json
答案 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