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

标签 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

最佳答案

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

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

关于mysql - 如何使用 Ruby on Rails 验证二进制字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29931780/

相关文章:

ruby - Shotgun 上的 Sinatra 和 Ruby 1.9.2 问题

ruby - 验证一个日期时间晚于另一个日期时间

php - 使用 MySQL 查询将数据导入 Wordpress-Magic 字段

ruby-on-rails - 设计路线助手在测试期间不再为人所知

Java 查询错误和安全

ruby-on-rails - Rails没有通过join模型运行has_many的destroy回调

ruby-on-rails - `fetch' : key not found: "S3_BUCKET_NAME" (KeyError) with paperclip/aws s3/rails

ruby - 如何序列化数组并反序列化

javascript - 将 MySQL 数据传递给 Javascript

php - while 循环不适用于 max(eno) 查询