如何在 Rails 上使用 Ruby 验证二进制字段?
How to validate a binary field using Ruby on Rails?
我想确保二进制字段始终具有值。我添加了如下验证码。
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
File.read
returns a 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'))
这应该可以解决您的编码问题。
我想确保二进制字段始终具有值。我添加了如下验证码。
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
File.read
returns a 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'))
这应该可以解决您的编码问题。