我对一个具有许多十进制和整数属性的模型使用默认的JSON序列化.一个例子是:

{ "user": { "id": 1234, "rating": "98.7" } }

请注意,在"rating"的值周围添加了引号.这会导致我使用的反序列化库错误地将其视为字符串(而不是小数).Rails可以设置为不使用所有小数的引号吗?

Edit:

我使用的是Rails 3.0.7和Ruby 1.9.2,如果这有区别的话.

Edit:

航站楼:

rails g model user rating:decimal
rake db:migrate

慰问:

user = User.create(rating: 98.7)
user.to_json

推荐答案

从语言A到语言B中输入小数的唯一"安全"方法是使用字符串.如果json包含"rating": 98.79999999999999,则可能会被JavaScript运行时转换为98.79999999999998.

参见BigDecimal as_json文档:

一个大的小数点很自然

这就是返回JSON字符串的原因.

如果您想强制Rails不引用这些,可以使用monkey patch BigDecimal(参见Rails source).

# not needed: to compare with the Numeric implementation
class Numeric
  def as_json(options = nil) self end #:nodoc:
  def encode_json(encoder) to_s end #:nodoc:
end

class BigDecimal
  def as_json(options = nil) self end
  def encode_json(encoder) to_s end #:nodoc:
end

Ruby-on-rails相关问答推荐

如何在rails 7中禁用Simple_Form验证

Rails 7.1,登录到STDOUT和LOG/Production.log

查询Where Date.parse Rails

Rails 5.1.7:Sprockets::Rails::Helper::AssetNotFound

用变量替换 find_or_create_by 中的键

为什么是 json.partial!使用新的哈希语法传递本地时,jbuiler 模板中的行不执行?

Ruby:如何通过谓词将一个集合拆分为 ruby​​ 中的两个集合?

只允许用户在 Rails 中输入字母和数字

如何将实例变量传递给 RSpec 共享示例

使用回形针进行简单裁剪

如何为 Rails SimpleForm Select 框设置默认 Select 值

fields_for 表单构建器对象为零

渲染:动作和渲染:模板之间的区别

在 ruby​​ on rails 上构建方法

Rails 3.0 中的 f.error_messages

在 Devise on Rails beta 3 中创建管理员用户

Active Record has_many:通过删除一条关联记录

我怎样才能看到水豚在失败的黄瓜步骤中发现了什么?

Rails:每个环境的初始化程序?

列出关联模型的名称