Почему открытый в Ruby open-uri возвращает StringIO в моем модульном тесте, но FileIO в моем контроллере?

Работает для меня:

.boldoption {
	font-weight: bold;
}
<select>
	<option>Some normal-font option</option>
	<option>Another normal-font option</option>
	<option class="boldoption">Some bold option</option>
</select>

29
задан Andrew Grimm 11 October 2017 в 05:11
поделиться

2 ответа

Код, ответственный за это, находится в классе Buffer в open-uri. Он начинается с создания объекта StringIO и создает фактический временный файл в локальной файловой системе только тогда, когда данные превышают определенный размер (10 КБ).

Я предполагаю, что любые данные, загружаемые тестом, достаточно малы, чтобы их можно было хранить в StringIO, а изображения, которые вы используете в реальном приложении, достаточно велики, чтобы гарантировать наличие файла TempFile. Решение состоит в том, чтобы использовать методы, которые являются общими для обоих классов, в частности метод read, с MiniMagick :: Image # from_blob:

temp_image = MiniMagick::Image.from_blob(open(self.public_filename, &:read))
26
ответ дан Nanda 11 October 2017 в 05:11
поделиться

Библиотека open-uri использует константу для установки предела размера в 10 КБ для объектов StringIO.

> OpenURI::Buffer::StringMax
=> 10240 

Вы можете изменить эту настройку на 0, чтобы в open-uri никогда не создавался объект StringIO. Вместо этого это заставит его всегда создавать временный файл.

Просто добавьте это в инициализатор:

# Don't allow downloaded files to be created as StringIO. Force a tempfile to be created.
require 'open-uri'
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
OpenURI::Buffer.const_set 'StringMax', 0

Вы не можете просто установить константу напрямую. Вам нужно удалить константу и затем установить ее снова (как указано выше), в противном случае вы получите предупреждение:

warning: already initialized constant StringMax

ОБНОВЛЕНО 18/12/2012 : Rails 3 не по умолчанию не требуется OpenURI, поэтому вам нужно добавить require 'open-uri' вверху инициализатора. Я обновил код выше, чтобы отразить это изменение.

69
ответ дан Micah Winkelspecht 11 October 2017 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: