Как добавить в расширения для существующего типа в Ruby MIME :: Types - PullRequest
3 голосов
/ 20 сентября 2011

MIME::Types распознает txt как text/plain

require 'mime/types'
MIME::Types.type_for("txt").first.to_s  # => "text/plain"

Я хочу, чтобы он делал то же самое для tab, чего по умолчанию нет

MIME::Types.type_for("tab").first.to_s  # => ""

Итак, учитывая, что:

MIME::Types['text/plain'].first.extensions

- это ["txt", "asc", "c", "cc", "h", "hh", "cpp", "hpp", "dat", "hlp"], почему не работает следующее:

MIME::Types['text/plain'].first.extensions.push("tab")
MIME::Types.type_for("tab").first.to_s  # => still just ""

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Mime::Type, по-видимому, не имеет методов для добавления расширений в существующий зарегистрированный обработчик.Что вы можете сделать, это преобразовать существующий обработчик в хеш, добавить собственное расширение, а затем заново зарегистрировать обработчик.Это выведет предупреждение, но оно будет работать:

text_plain = MIME::Types['text/plain'].first.to_hash
text_plain['Extensions'].push('tab')
MIME::Types.add(MIME::Type.from_hash(text_plain))
MIME::Types.type_for("tab").first.to_s # => 'text/plain'

Или, если вы хотите быть умным и сбивающим с толку и делать все это в одной строке:

MIME::Types.add(MIME::Type.from_hash(MIME::Types['text/plain'].first.to_hash.tap{ |text_plain| text_plain['Extensions'].push('tab') }))
MIME::Types.type_for("tab").first.to_s # => 'text/plain'

Если по какой-то причиневам нужно подавить предупреждающее сообщение, вы можете сделать это следующим образом (при условии, что вы запускаете код в системе linux-y):

orig_stdout = $stdout
$stdout = File.new('/dev/null', 'w')
# insert the code block from above
$stdout = orig_stdout
0 голосов
/ 07 марта 2013

Другой способ - создать новый тип контента, например,

.

stl_mime_type_hash = MIME::Type.new('application/vnd.ms-pkistl').to_hash stl_mime_type_hash['Extensions'].push('stl') MIME::Types.add(MIME::Type.from_hash(stl_mime_type_hash))

...