Rails3: визуализация образа в памяти в представлении - PullRequest
3 голосов
/ 26 августа 2011

У меня есть приложение rails, в памяти которого в контроллере есть файл png, сгенерированный spark_pr .

@pngfile << Spark.plot( [47, 43, 24, 47, 16, 28, 38, 57, 50, 76, 42, 20, 98, 34, 53, 1, 55, 74, 63, 38, 31, 98, 89], :has_min => true, :has_max => true, 'has_last' => 'true', 'height' => '40', :step => 10, :normalize => 'logarithmic' )
@user=User.all.first

Я хотел бы отобразить этот png-файл в моем представлении, который является app / views / users / show.html.erb, и в нем есть стандартный материал, сгенерированный генератором скаффолдов Rails, где он отображает различные атрибуты @user.

Как я могу отобразить этот файл в памяти (@pngfile) в моем представлении? Я не хочу сохранять файл и даже не хочу предоставлять временный URL для этого файла. Я видел, как это делается на HTML-страницах с встроенными значками, отображаемыми из двоичного двоичного объекта, поэтому я знаю, что это возможно. Но я не мог понять магические заклинания с помощниками вида Rails, которые делают это возможным.

----------- РЕДАКТИРОВАТЬ: Дополнительная информация -------------------------

Этот сайт предоставляет дополнительную информацию о том, как вставлять URL-адреса. Код для значка папки выглядит следующим образом:

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcpp
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" 
width="16" height="14" alt="embedded folder icon">

Я включил этот точный код в мой взгляд, и он работал для Chrome, Firefox и IE9.

Так что я попытался сделать это с моим искровым заговором.

В моем контроллере Rails я сделал это:

    @pngfile = Base64.encode64 Spark.plot( [47, 43, 24, 47, 16, 28, 38, 57, 50, 76, 42, 20, 98, 34, 53, 1, 55, 74, 63, 38, 31, 98, 89], :has_min => true, :has_max => true, 'has_last' => 'true', 'height' => '40', :step => 10, :normalize => 'logarithmic' )

На мой взгляд, я попробовал несколько разных трюков

<%=image_tag "data:image/png;base64,"+@pngfile %>

<%=image_tag "data://image/png;base64,"+@pngfile %>

<img src=<%="data:image/png;base64,"+@pngfile %>  ></img>

<img src=<%=raw("data:image/png;base64,"+@pngfile) %>  ></img>

Все они потерпели неудачу, кроме второго, и он работал в Chrome и Firefox, но не в IE9. Первый должен был сработать, но код помощника image_tag по умолчанию добавляет «/ images /» к моему URL, даже если это непосредственный URL данных. Я знаю это, потому что я пытался просмотреть изображение на другой вкладке, и это не удалось. Но когда я удалил часть "/ images /", все заработало нормально. Я понятия не имею, почему второй работал. Я просто попробовал это по прихоти. Третий не удался, потому что казалось, что части строки были разбиты из-за специальных символов. Я попытался использовать необработанную строку в четвертой, но она тоже не сработала.

На данный момент я в тупике. Пытаюсь ли я сделать monkey-patch для image_tag, чтобы он не добавлял данные для данных: URL для встраиваемых изображений, или я делаю что-то необычное со строкой, чтобы она правильно отображалась, как в примерах 3 или 4?

1 Ответ

5 голосов
/ 26 октября 2011

Я только что столкнулся с подобной проблемой. В моем случае я определил base64_image в application_helper:

def base64_image image_data
  "<img src='data:image/png;base64,#{image_data}' />".html_safe
end

так что в вашем случае вы бы просто использовали это вместо image_tag:

base64_image(@png_file)
...