【问题标题】:How can I avoid "Are you sure you want to send a form again?"?如何避免“您确定要再次发送表单吗?”?
【发布时间】:2013-02-01 19:10:14
【问题描述】:

在我的应用中

用户可以像这样访问社区页面
http://example.com/communities?tag=lovely

然后,如果我尝试返回上一页。我总是收到这条消息

Are you sure you want to send a form again

这仅在从 Safari 访问时出现

我怎样才能避免这种情况。我不希望用户每次返回时都看到它。

routes.rb

resources :communities

【问题讨论】:

  • 因此,您将返回为响应您发布的表单而生成的页面。这在例如在线银行系统中可能是不可取的。这就是浏览器询问您的原因。 “我怎样才能避免呢?” - 嗯,不要回到这样的页面? :)
  • @SergioTulentsev 感谢您的回复。这就是它应该的样子吗?当你有标签搜索系统时。你的应用会和我的一样吗?
  • 您可以用javascript替换window.location,而不是发布表单,从而将其转换为GET-request
  • @SergioTulentsev 你能告诉我怎么做吗?

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

避免此问题的一种方法是让您的 POST 响应将 redirect (HTTP 301 or 303) 返回到新页面,然后浏览器使用 GET 请求该新页面。返回应该(尽管并不总是)获取原始表单页面,而不是 POST。

在 Rails 中,这种绕行通常如下所示:

  1. 客户端获取/foos/new
  2. 服务器返回带有<FORM method='POST' action='/foos'>的HTML
  3. 客户端 POST /foos(带参数)
  4. 服务器创建一个 ID 为 123 的新 Foo
  5. 服务器返回重定向到/foos/123
  6. 客户端获取/foos/123
  7. 服务器为新创建的 Foo 返回 HTML

【讨论】:

  • 感谢您的回复。现在我的输出代码就像这样respond_to do |format| format.html # index.html.erb format.json { render json: @communities } end
  • 是的,听起来不错。奇怪的是样板 Rails 代码还没有处理这个问题。
  • 再次查看您的问题代码,可能问题是您使用 POST 获取/communities?tag=lovely,而您应该使用 GET。 POST 用于在服务器上创建或更新数据时; GET 用于读取已经存在的内容。
  • 我该如何解决这个问题?我应该添加get 'communities/tag=:tag' => 'communities#index', :via => :get, :as => :communities_tag
  • 我相信您的问题不在于路由,而在于请求页面上的客户端代码(HTML 或 JS)。 Rails resources :communities 应该为您的def index 方法提供正确的路径,并在params 数组中传递tag 参数。
【解决方案2】:

只需添加

window.location.replace("about:blank");

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多