我正在尝试从服务器进行简单的下载。这是使用Rails 5.01,Ruby 2.24p230。
该视图具有指向控制器的链接以下载数据。它到达那里就好了。
控制器方法就是这样:
def download
send_data("some sample text", filename:sample.txt)
flash[:success] = "it worked"
end
结果是将包含正确文本的文件命名为sample.txt,并将其下载到客户端。闪光从未发生过。链接到控制器的视图仍在屏幕上,没有任何页面刷新。永远不会调用名为“download.html.erb”的视图。
我的问题是:
是否有一种简单的方法可以在send_data之后与客户端进行某些通信?在成功下载后告诉客户端的人会很高兴。
在send_data之后,会发生什么?
感谢您抽出宝贵时间来回答这个问题。
答案 0 :(得分:2)
要了解这里发生的事情,您必须了解会话和闪烁的工作原理。
Flash消息存储在会话中并继续执行下一个请求。当请求完成时,来自先前请求的闪存消息将从" flash hash"中删除。它存储在会话中。
class TestController
# GET /foo
def foo
flash[:notice] = "Hello"
redirect_to '/bar'
end
# GET /bar
def bar
flash.now[:alert] = " world!"
end
end
因此,当用户请求/foo
时,他们会被重定向到/bar
,并且Flash哈希将包含:
{
notice: "Hello",
alert: " world!"
}
那么这是如何相关的?当客户端点击下载按钮时,您设置的Flash消息将在他们执行的下一个请求中看到。哪个不是那么有用。相反,你想要做的只是使用javascript并在用户点击下载链接时显示弹出窗口或某种消息。
当您向客户端发送数据时,实际上很少会允许您设置任何类型的重定向,或者忽略您发送的任何标头。这是因为大量的烦人或恶意使用。