0

我在视图中有一个 div 标签,我想用我通过 Gruff 生成的图表来更新它。

我有以下控制器操作,最后执行此操作

send_data g.to_blob, :disposition=>'inline', :type=>'image/png', :filename=>'top_n.pdf'

现在,如果我直接调用此操作,我可以看到图表。(如果需要,请在此处获取更多详细信息。)

如果我添加一个link_to_remote_tag通过 AJAX 传入特定输入调用上述操作的方法,生成此图并尝试更新占位符 div 标记...我看到胡言乱语。

我想我可以将图形写入 png 文件,g.write(filename.png)如何在运行时将图形嵌入到视图中的 div 标记中?

4

2 回答 2

1

在您的 link_to_remote 标记中,只需将 :complete 设置为如下所示:

: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 => path_to_new_image );然后,在 :complete 中使用这个请求变量。

于 2008-12-01T17:29:55.113 回答
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

你甚至会有一个正常的生成器 url,如下所示:

<img src="controller/graph.png" alt="Something"/>

如果图像生成有可能失败:您可以在服务器上存储备用图像并读取该文件并返回该文件。

如果生成量很大并且不太可能一直更改,那么您也可以缓存结果文件,如果您确定数据没有更改,则改为获取该文件。您可以使用 ARemesal 建议的方法延迟添加图像链接,直到生成图像,然后直接链接到缓存文件。(这取决于您的具体情况,什么是最好的)

于 2008-12-01T17:44:53.977 回答