我正在使用 rails 6.0.3.6 和 ruby 3.0.0,
当我打电话{'user' : User.first }.to_json
时,我得到"{\"user\":\"#<User:0x00007fa0a8dae3c8>\"}"
与[User.first, User.last].to_json
如果我切换回 ruby 2.7.2,我会得到正确的结果,即<User:0x00007fa0a8dae3c8>
替换为它的所有属性。
知道我缺少什么吗?
我正在使用 rails 6.0.3.6 和 ruby 3.0.0,
当我打电话{'user' : User.first }.to_json
时,我得到"{\"user\":\"#<User:0x00007fa0a8dae3c8>\"}"
与[User.first, User.last].to_json
如果我切换回 ruby 2.7.2,我会得到正确的结果,即<User:0x00007fa0a8dae3c8>
替换为它的所有属性。
知道我缺少什么吗?
问题出在 Rails 6.0.3.6 中,当to_json
在{'user' : User.first }
Rails 上调用最终添加一个JSON::Ext::Generator::State
参数时to_json
,options.is_a?(::JSON::State)
返回 true 并super(options)
返回。
从 的定义to_json
:
def to_json(options = nil)
if options.is_a?(::JSON::State)
# Called from JSON.{generate,dump}, forward it to JSON gem's to_json
super(options)
else
# to_json is being invoked directly, use ActiveSupport's encoder
ActiveSupport::JSON.encode(self, options)
end
end
而在最近的 Railsto_json
中,调用时没有任何参数,分支采用 finally return 的路径ActiveSupport::JSON.encode(self, options)
。
所以,在你的情况下,你可以做
{ 'user': User.first.attributes }.to_json
绕过问题。
{'user': User.first }.as_json
使用 as_json 而不是 to_json