gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:01 24 4
gpt4 key购买 nike

我正在使用 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 routes 时产生的结果

           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

最佳答案

我认为您的假设不正确。您问当用户返回表单以更正错误时,如何防止浏览器栏中的 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

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

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

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

恕我直言,您问题的答案是:如果不离开 Rails 选择的路径并构建完全不同的路由、 Controller 和表单设置,您将无法做您想做的事。您需要为 GETPATCH(或 POST)请求配置相同的路由。并且 Controller 方法需要能够以不同的方式处理这两种类型的请求。由于 Rails 2.0 资源路由是首选方式。你想要的东西在 Rails 2.0 之前很常见

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

关于ruby - 当用户返回表单以更正错误时,如何防止浏览器栏中的 URL 发生更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41434468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com