我在视图中有一个div标签,我想用我通过Gruff生成的图表进行更新。
我有以下控制器操作,最后执行此操作
send_data g.to_blob, :disposition=>'inline', :type=>'image/png', :filename=>'top_n.pdf'
现在,如果我直接调用此操作,我可以看到图表。 (如果需要,请提供更多详细信息here。)
如果我添加一个link_to_remote_tag
通过传递特定输入的AJAX调用上述操作,生成此图并尝试更新占位符div标签...我看到了乱码。
我想我可以使用g.write(filename.png)
将图形编写到png文件中如何在运行时将图形嵌入到视图中的div标记内?
答案 0 :(得分:1)
在你的link_to_remote标签中,只需设置:完成如下:
:complete => "updateImg(id_of_div, request.responseText)"
编写JS函数:
function updateImg(id, img)
{
$(id).innerHTML = '<img src="' + img + '" />';
}
当你想要显示图像时,id_of_div是div的id。
request.responseText var来自AJAX调用的请求,我的意思是,当你的代码用图形写png文件时,完成返回这个新png的路径的方法(render:text =&gt; path_to_new_image) ;然后,在:complete。
中使用此请求变量答案 1 :(得分:0)
您可以使用常规img
标记来调用控制器操作,该操作将返回生成的png。如果您将控制器设置为使用respond_to这样的内容:
def graph
# get the relevant data for 'g' here
respond_to do |format|
format.html #uses the default view if relevant (good for debugging)
format.png do
send_data g.to_blob,
:disposition=>'inline',
:type=>'image/png',
:filename=>'top_n.pdf'
end
end
end
你甚至可以为这个生成器找到一个正常的网址:
<img src="controller/graph.png" alt="Something"/>
如果图像生成有可能失败:您可以在服务器上存储一个后备图像并读取该文件并返回该文件。
如果生成非常繁重并且不太可能一直改变,那么所有文件都会缓存生成的文件,如果确定数据没有更改,则会获得该文件。您可以使用ARemesal建议的方法来延迟添加图像链接,直到生成图像,然后直接链接到缓存文件。 (这取决于你的具体情况最好)