如何从控制器发送send_data()后继续?

时间:2017-01-13 21:42:47

标签: 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

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

我的问题是:

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

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

  3. 感谢您抽出宝贵时间来回答这个问题。

1 个答案:

答案 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并在用户点击下载链接时显示弹出窗口或某种消息。

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