【问题标题】:How to validate a binary field using Ruby on Rails?如何使用 Ruby on Rails 验证二进制字段?
【发布时间】:2015-04-28 23:37:31
【问题描述】:

我想确保二进制字段始终具有值。我添加了如下验证码。

class Foo < ActiveRecord::Base
  validates :b, presence: true
end

但是,更改似乎会导致错误。

$ rails c
> Foo.create(b:File.read('b.jpg'))

ArgumentError: invalid byte sequence in UTF-8

错误并不总是出现。仅当二进制数据有非 ASCII 码时。

如何验证二进制字段?

我制作了如下环境。还需要一个图片文件(b.jpg,小于16KB)。

$ rails --version
Rails 4.2.0
$ rails new test_binary --database=mysql
$ cd test_binary/
$ rails g model foo b:binary
$ rake db:create db:migrate

【问题讨论】:

    标签: mysql ruby-on-rails ruby encoding rails-activerecord


    【解决方案1】:

    File.read 返回一个String,默认情况下将声称具有 UTF-8 编码。这意味着:

    Foo.create(b: File.read('b.jpg'))
    

    真的是:

    some_utf8_string = File.read('b.jpg')
    Foo.create(b: some_utf8_string)
    

    但 JPEG 很少是有效的 UTF-8 字符串,因此每当有人试图将其视为 UTF-8 时,您都会得到 ArgumentError

    您可以在读取 JPEG 文件时指定编码:

    Foo.create(b: File.read('b.jpeg', encoding: 'binary'))
    

    这应该可以解决您的编码问题。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2012-12-19
      • 2023-04-10
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多