2015-04-28 49 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