javascript - 具有 'remote: true' 的表单即使使用重定向也会返回 200 响应

标签 javascript ruby-on-rails

我有一个带有 remote: true 的表单,如下所示:

<%= form_with model: @transfer, scope: :transfer, url: transfers_path, method: 'post', remote: true do |f| %>

我的 Controller create 操作如下所示:

def create
  @transfer = @account.transfers.build(transfer_params)
  respond_to do |format|
    if @transfer.save
      format.html { redirect_to transfers_path }
    else
      format.js
    end
  end
end

如果我提交了一个没有错误的表单,页面会像预期的那样重定向。但是,我注意到服务器响应状态代码为 200,而不是 302。我的服务器日志如下所示:

Started POST "/transfers" for ::1 at 2019-06-04 08:32:22 -0700
Processing by TransfersController#create as JS
...
Redirected to http://localhost:3000/transfers
Completed 200 OK in 1476ms (ActiveRecord: 81.2ms)

Started GET "/transfers" for ::1 at 2019-06-04 08:32:23 -0700
Processing by TransfersController#index as HTML

只是想知道为什么它是 200 而不是 302?我还意识到这永远不会奏效,因为我不应该能够使用 AJAX 请求进行重定向(如果我理解正确,remote: true 会发送 AJAX 请求)。

关于 SO 的其他问题的答案似乎表明 redirect_to 不起作用,我必须使用 JS 来设置重定向的窗口位置。一些示例答案:

我对为什么我的代码能正常工作感到困惑。任何人都可以对此有所了解吗?我怀疑 rails-ujs在幕后做一些魔术,但我不确定。具体来说,我怀疑these lines但我不太擅长 JS,我无法解析其中的大部分内容。我也在运行 Rails 5.2.1。

最佳答案

首先,form_with 不使用remote,它使用local 并且设置为false默认情况下,就像 form_forremote: true 一样。

其次,respond_to 并不像您认为的那样有效。您不选择响应格式,而是由客户选择。

如果客户端发送常规 HTTP 请求 (remote: false),则您的 create 会在 format.html 之后响应该 block 。如果客户端发送 AJAX 请求 (remote: true),则 create 会使用 format.js 部分进行响应。

没有重定向,因为 format.html { redirect_to transfers_path } 在您发出 AJAX 请求后从未运行。

在浏览器开发工具的网络选项卡中检查响应,以了解实际情况。

另外,重构你的方法:

def create
  @transfer = @account.transfers.build(transfer_params)
  saved = @transfer.save
  respond_to do |format|
    format.html do
      if saved
        redirect_to transfers_path
      else
        flash.now[:notice] = 'Error'
        render :new
      end
    end
    format.js # Create app/views/<controller>/create.js.erb and
              # update page there
  end
end

关于javascript - 具有 'remote: true' 的表单即使使用重定向也会返回 200 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56447279/

相关文章:

ruby-on-rails - 如何将脚本实现到 Rails 应用程序?

javascript - ajax 报告成功但数据库没有任何变化

javascript - 在我的代码中,javascript 无法与 asp.net 正常工作?

javascript - 哪些(javascript)环境支持 ECMAscript 5 严格模式? (又名 "use strict")

Javascript 表单验证提交错误

ruby-on-rails - 这段代码是做什么的,我怎样才能更简单地编写它?

ruby-on-rails - 将属性值添加到 has_many 中的连接表记录 :through association upon creation

ruby-on-rails - 在 Controller 中找不到 namespace 内的 Ruby on Rails 模型

javascript - 在页面加载时延迟 jQuery 效果

ruby-on-rails - 重定向回来但有错误