从控制器发送_数据()后如何继续?

Ken*_*ast 1 ruby-on-rails download

我正在尝试从服务器进行简单的下载。这是使用 Rails 5.01,Ruby 2.24p230。

该视图具有到控制器的链接以下载数据。它到达那里就好了。

控制器方法就是这样:

  def download
    send_data("some sample text", filename:sample.txt)
    flash[:success] = "it worked"
  end
Run Code Online (Sandbox Code Playgroud)

结果是一个名为 sample.txt 的包含正确文本的文件被下载到客户端。闪光永远不会发生。链接到控制器的视图仍然在屏幕上,没有任何页面刷新。永远不会调用名为“download.html.erb”的视图。

我的问题是:

  1. 是否有一种简单的方法可以在 send_data 之后与客户端进行一些通信?在成功下载后告诉客户端上的人会很好。

  2. 在 send_data 之后,应该发生什么?

感谢您抽出时间来回答这个问题。

max*_*max 5

要了解这里发生了什么,您必须了解会话和闪烁的工作原理。

一个 flash 消息存储在会话中并继续进行下一个请求。当请求完成时,来自先前请求的闪存消息将从存储在会话中的“闪存哈希”中删除。

class TestController

  # GET /foo
  def foo
    flash[:notice] = "Hello"
    redirect_to '/bar'
  end

  # GET /bar
  def bar
    flash.now[:alert] = " world!"
  end
end
Run Code Online (Sandbox Code Playgroud)

因此,当用户请求时,/foo他们被重定向到/barFlash 哈希将包含:

{
  notice: "Hello",
  alert: " world!"
}
Run Code Online (Sandbox Code Playgroud)

那么这有什么关系呢?当客户端单击下载按钮时,您设置的 Flash 消息将在它们执行的下一个请求中看到。这不是那么有用。相反,您想要做的可能只是使用 javascript 并在用户单击下载链接时显示弹出窗口或某种消息。

当您向客户端发送数据时,实际上很少有人会允许您设置要遵循的任何类型的重定向,或者会忽略您发送的任何标头。这是因为大量潜在的烦人或恶意用途。