【问题标题】:Rails link_to :back redirect itself in a loop on form submission errorRails link_to :back 在表单提交错误的循环中重定向自身
【发布时间】:2020-01-01 18:27:31
【问题描述】:

使用 Rails 6,但这应该适用于任何支持带有引用者的 Rails 反向链接的 Rails 版本。代码如下:

# posts/new.html.erb
<%= link_to "Back", :back %>
<%= form_with model: @post do |form| %>
  ...
<% end %>

这是页面流程:

  1. 首页->查看新帖->点击返回->返回首页

  2. 主页 -> 查看新帖子 (/posts/new) -> 提交空表单 -> 返回到新帖子 (/posts/new) 错误(因为验证失败) -> 单击返回 -> 返回再次发布新页面 (/posts/new) -> 单击返回 -> 再次返回到发布新页面 (/posts/new)

在案例 2 中,当我检查 Back 链接的 href 时,它一直指向 /posts/new。这是由于我认为的推荐人。但是解决方法是什么,所以它应该返回主页?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    在 Rails 中,当用户提交无效表单时,您不会重定向回来 - 您呈现包含表单的视图并将其发送回响应正文中。

    class PostsController < ApplicationController
      # ...
      # POST /posts
      def create
        @post = Post.new(post_params)
        if @post.save
          redirect_to @post
        else
          # renders the posts/new.html.erb template
          render :new
        end
      end
      # ...
    end
    

    当用户提交表单时,他们会发送一个非幂等的 POST 请求。您应该向他们展示执行该操作的结果,无论是创建新资源(通常是重定向到新资源)还是再次显示错误的表单。

    不应重定向回幂等 GET /posts/new 路由。这将要求您将任何参数作为查询字符串参数传回或丢失任何用户输入。

    这不仅仅是 REST 语义或遵循约定的问题 - 这避免了在表单提交后困扰重定向的浏览器历史问题以及在使用反向代理服务 GET 请求时可能出现的缓存问题。

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多