如何使用Ruby on Rails验证二进制字段?

时间:2015-04-28 23:37:32

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

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

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

1 个答案:

答案 0 :(得分:3)

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'))

那应该超过你的编码问题。