Я столкнулся с другой проблемой при использовании Rails 4.2.4 и адаптера PostgreSQL (pg) и пользовательского валидатора для моего поля json.
В следующем примере:
class SomeController < BaseController
def update
@record.json_field = params[:json_field]
end
end
если вы передадите недопустимый JSON
params[:json_field]
тихо игнорируется и "ноль" сохраняется в
@record.json_field
Если вы используете пользовательский валидатор, такой как
class JsonValidator < ActiveModel::Validator
def validate(record)
begin
JSON.parse(record.json_field)
rescue
errors.add(:json_field, 'invalid json')
end
end
end
вы не увидите неверную строку в
record.json_field
только значение "nil", потому что rails выполняет приведение типов перед передачей вашего значения в валидатор. Чтобы преодолеть это, просто используйте
record.json_field_before_type_cast
в вашем валидаторе.