【问题标题】:Form with 'remote: true' return a 200 response even with redirect带有“remote: true”的表单即使使用重定向也会返回 200 响应
【发布时间】:2019-06-04 15:47:28
【问题描述】:

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

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

而我的控制器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。

【问题讨论】:

    标签: javascript ruby-on-rails


    【解决方案1】:

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

    其次,respond_to 不像你认为的那样有效。您不选择响应格式,客户端会选择。

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

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

    在浏览器开发工具的 network 选项卡中检查 response,了解实际情况。

    另外,重构你的方法:

    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
    

    【讨论】:

    • 正在进行重定向。在我成功发布转移后,我的页面确实转到了/transfers。这是我最困惑的部分。我也有一个create.js.erb,但它严格用于处理错误,我发现即使我删除了该文件,在我发布传输后页面仍然会重定向并且仍然以 200 代码响应。
    • 您是否检查了开发工具的 network 选项卡?有什么反应?它的类型是什么?
    • 是的,我检查了网络选项卡,响应的类型为xhr,状态为200
    • 这个重定向怎么样:Redirected to http://localhost:3000/transactions/pending?操作pending 是否发出get index
    • 啊我很抱歉我意识到我复制了错误的路线。我已经编辑了我的问题,但 http://localhost:3000/transactions/pending 应该是 http://localhost:3000/transfers 而不是。我的Transfers#create 正在重定向到Transfer#index
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 2012-01-14
    • 2021-08-09
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多