如何在Rails中使用生成的图像更新占位符的内容?

时间:2008-12-01 15:33:37

标签: ruby-on-rails graph

我在视图中有一个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标记内?

2 个答案:

答案 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建议的方法来延迟添加图像链接,直到生成图像,然后直接链接到缓存文件。 (这取决于你的具体情况最好)