2011-08-25 54 views
3

我有一个Rails应用程序,在控制器的内存中有一个png文件,由spark_pr生成。Rails3:在视图中渲染内存中的图像

@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 

我想呈现在我看来,这是应用程序/视图/用户/ show.html.erb这个png文件,并且它具有由Rails的脚手架发电机在此它显示各种属性所产生的标准的东西@user。

如何在我的视图中渲染这个内存文件(@pngfile)?我不想保存该文件,也不想为该文件提供临时URL。我已经在HTML页面上看到了这一点,它使用二进制blob呈现的内嵌图标,所以我知道这是可能的。但我无法弄清楚使用Rails视图助手的魔术咒语,这使得这成为可能。

-----------编辑:更多信息-------------------------

This site给有关如何嵌入网址的更多信息。文件夹图标的代码如下所示:

<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,"[email protected] %> 

<%=image_tag "data://image/png;base64,"[email protected] %> 

<img src=<%="data:image/png;base64,"[email protected] %> ></img> 

<img src=<%=raw("data:image/png;base64,"[email protected]) %> ></img> 

都失败了,除了第二个,它在Chrome工作, Firefox,但不是IE9。 第一个应该可以工作,但是image_tag帮助程序的代码默认预设为“/ images /”,即使它是立即数据URL。我知道这是因为我试图在不同的选项卡中查看图像,并且失败了。但是当我剥离“/ images /”部分时,它运行良好。 我不知道为什么第二个人工作。我只是随心所欲地尝试了它。 第三个失败,因为它看起来像字符串的部分由于特殊字符被分解。我尝试在第四个使用原始字符串,但它也没有工作。

在这一点上,我很难过。我是否尝试猴子补丁image_tag,以便它不预先填充数据的内容:用于嵌入图像的URL,还是我会对字符串做一些时髦的事情,以便像视图示例3或4一样正确渲染它?

回答

5

我刚刚面临类似的问题。就我而言,我在application_helper定义base64_image

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

所以你的情况,你只希望用这个来代替image_tag

base64_image(@png_file)