当用户返回表单以更正错误时,如何防止浏览器栏中的 URL 发生更改?

问题描述 投票:0回答:7

我正在使用 Rails 5。我有一个页面,用户可以在其中更新他们的个人资料,如果出现问题,他们会返回到该页面

  def update
    @user = current_user
    if @user.update_attributes(user_params)
      …
      redirect_to url_for(:controller => ‘main’, :action => 'index') and return
    end

    render 'edit'
  end

问题是,当他们返回到原始页面时,浏览器栏中的 URL 会显示“http://localhost:3000/users/51”,这不是他们访问的原始 URL(即“http://localhost:3000/users/edit”)。我怎样才能让 URL 保持原来的样子?

编辑:这是我运行 rake 路线时产生的结果

           edit_users GET    /users/edit(.:format)                      users#edit
                users GET    /users(.:format)                           users#index
                      POST   /users(.:format)                           users#create
             new_user GET    /users/new(.:format)                       users#new
            edit_user GET    /users/:id/edit(.:format)                  users#edit
                 user GET    /users/:id(.:format)                       users#show
                      PATCH  /users/:id(.:format)                       users#update
                      PUT    /users/:id(.:format)                       users#update
                      DELETE /users/:id(.:format)                       users#destroy
ruby url redirect controller ruby-on-rails-5
7个回答
4
投票

我认为你的假设是不正确的。您问当用户返回表单以更正错误时,如何防止浏览器栏中的 URL 发生更改?

答案是:当用户再次看到表单以更正错误时,浏览器中的 URL 不会改变。因为第一次发送表单时 URL 已经改变了。

使用

routes.rb
遵循通用约定,您将拥有以下路线(使用
rails routes
列出它们):

GET    /users(.:format)          users#index
POST   /users(.:format)          users#create
GET    /users/new(.:format)      users#new
GET    /users/:id/edit(.:format) users#edit
GET    /users/:id(.:format)      users#show
PATCH  /users/:id(.:format)      users#update
PUT    /users/:id(.:format)      users#update
DELETE /users/:id(.:format)      users#destroy

当您向

GET
发出
/users/:id/edit
请求时,将呈现用户更新表单。但该表单的实际更新请求已发布到
PATCH /users/:id
。这意味着浏览器已经使用了另一个 URL。

update
方法中(记住它已经位于 URL
/users/:id
),你基本上只有两个选择:

  1. 渲染一些东西。在操作中渲染视图会保持 URL 不变(仍然是
    /users/:id
    ),但您可以更改为使用分配给
    @user
    的用户,例如在表单上显示其错误。这是更新失败时 Rails 的默认行为。
  2. 您可以将浏览器重定向到另一个 URL(例如返回到
    /users/:id/edit
    或完全不同的 URL,例如主页)。这会更改浏览器地址栏中的 URL。但是重定向总是会发出新的
    GET
    请求,这意味着您会丢失通过
    post
    发送的信息,并且您将丢失当前分配给
    User
    @user
    实例。在
    GET
    之后,用户将从数据库中重新加载,因此不会分配任何错误。在 Rails 中,更新成功时会使用重定向,以防止用户在浏览器中点击重新加载按钮时再次出现
    POST

恕我直言,你的问题的答案是:如果不离开 Rails 选择的路径并构建完全不同的路线、控制器和表单设置,你就无法做你想做的事。您需要为

GET
PATCH
(或
POST
)请求配置相同的路由。控制器方法需要能够以不同的方式处理两种类型的请求。由于 Rails 2.0 资源路由是首选方式。你想要的东西在 Rails 2.0 之前很常见

我的建议是:遵循 Rails 约定。 URL 并不重要,没有人真正关心。我认为不遵循 Rails 约定只是为了获得另一个表单 URL 没有任何好处。


2
投票

您可以使用以下语法:

redirect_to :back

1
投票

我怀疑这可能就是您正在寻找的。

redirect_to :edit

http://api.rubyonrails.org/classes/ActionController/Redirecting.html


1
投票

当我开始使用 Rails 时,我也遇到了同样的问题。

但是……

需要记住的一件事是记住为什么 Rails 被称为“Rails”。

Rails之所以称为Rails,是因为Rails的核心设计原则是关于铁路的。 Rails 通过“约定优于配置”使构建网站变得容易,这意味着提供一种且唯一的一种做事方式,因此可以用铁路来比喻。 作为程序员,当我们选择使用 Rails 时,我们同意坚持使用 Rails 为我们创建的铁轨,以换取轻松的编程体验。这就像选择火车而不是汽车一样,你必须保持在轨道上,但作为交换,事情会变得更容易。

因此大家的答案很可能都是“不用担心偏离轨道,沿着铁轨走就行了”。

您可以在 Rails 的创建者 DHH 的这篇文章中阅读更多有关“约定优于配置”和 Rails 设计理念的文章 —

http://rubyonrails.org/doctrine


0
投票

使用
    render
  • 显示错误
    在routes.rb中使用URL 
  • /users/edit
  • 创建路由PUT或PATCH
    在您的视图中使用此路线(检查
  • form_for
  • 参数)
    将用户 ID 存储在某处:
    
    
  • 如果您正在编辑登录用户,我建议使用会话。
    • 否则,我建议在表单中添加
    • hidden_field_tag
    • 参数
    相应地更新控制器中的
  • current_user
  • 功能
    
        

0
投票

redirect_to edit_user_path



0
投票
show

edit
模板相同,这两个目的都可以,编辑时实际上是编辑页面,否则视为显示页面,当有错误时,它会显示错误
    

© www.soinside.com 2019 - 2024. All rights reserved.