2015-04-28 31 views
1

我想确保二进制字段始终具有价值。我添加了如下所示的验证代码。如何使用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 

回答

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字符串,所以你要拿到ArgumentError每当有人试图把它当作UTF-8。

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

这应该让过去的编码问题:

当你读你的JPEG您可以指定一个编码。

+2

或者使用'File.binread('b.jpeg')' – huocp

+0

谢谢!两人都工作。 – yosei