我使用的是rails6.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>
替换为它的所有属性。
你知道我错过了什么吗
我使用的是rails6.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>
替换为它的所有属性。
你知道我错过了什么吗
3条答案
按热度按时间bgibtngc1#
问题出在Rails www.example.com中6.0.3.6当在
{'user' : User.first }
上调用to_json
时,Rails最终为to_json
添加了JSON::Ext::Generator::State
参数,因此options.is_a?(::JSON::State)
返回true,并返回super(options)
。根据
to_json
的定义:而在最近的Rails中,
to_json
是在没有任何参数的情况下调用的,分支采用路径最终返回ActiveSupport::JSON.encode(self, options)
。所以,在你的情况下,你可以
为了“绕过”这个问题。
6ju8rftf2#
使用as_json代替to_json
xe55xuns3#
我们直接谈正事吧。
要始终重现并了解您遇到的问题,请打开Rails控制台并测试以下代码:
如果你看到这样的输出-不幸的是你有这个问题,但这不是一个悲剧;)
render json: { user: user }
语法的API端点json.(@user, :id, :profile)
或一些非序列化ActiveRecord对象,例如json.profile @user.profile
如果您确实需要这些版本-* 请确保您没有任何具有大量JSON逻辑或以任何方式依赖于 *
JSON::Ext::Generator::State
的库。除了这个事实-应该有助于保持它游泳👍