to_json 在 ActiveRecord 对象上 ruby 3.0
to_json on ActiveRecord object ruby 3.0
我正在使用 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>
替换为它的所有属性。
知道我错过了什么吗?
{'user': User.first }.as_json
使用as_json代替to_json
问题出在 Rails 6.0.3.6 中,当在 {'user' : User.first }
上调用 to_json
时 Rails 最终为 [=12= 添加了一个 JSON::Ext::Generator::State
参数],因此 options.is_a?(::JSON::State)
return 为真,super(options)
为 return。
根据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
虽然在最近的 Rails to_json
中调用时没有任何参数,并且分支采用最终 return ActiveSupport::JSON.encode(self, options)
.
的路径
所以,在你的情况下你可以这样做
{ 'user': User.first.attributes }.to_json
绕过问题。
我正在使用 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>
替换为它的所有属性。
知道我错过了什么吗?
{'user': User.first }.as_json
使用as_json代替to_json
问题出在 Rails 6.0.3.6 中,当在 {'user' : User.first }
上调用 to_json
时 Rails 最终为 [=12= 添加了一个 JSON::Ext::Generator::State
参数],因此 options.is_a?(::JSON::State)
return 为真,super(options)
为 return。
根据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
虽然在最近的 Rails to_json
中调用时没有任何参数,并且分支采用最终 return ActiveSupport::JSON.encode(self, options)
.
所以,在你的情况下你可以这样做
{ 'user': User.first.attributes }.to_json
绕过问题。