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

     2023-02-22     30

关键词:

【中文标题】当用户返回表单以更正错误时,如何防止浏览器栏中的 URL 发生变化?【英文标题】:How do I prevent URL in browser bar from changing when a user is returned to a form to correct errors? 【发布时间】:2017-05-17 00:16:35 【问题描述】:

我正在使用 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

【问题讨论】:

and return 是一个不好的习惯,因为不能保证像 redirect_to 方法这样的东西会返回逻辑上的真实值。最好使用return redirect_to ...,这样就不会失败。 通常我建议做@user.update_attributes! 和重定向。如果更新时出现问题,您将收到 ActiveRecord::RecordInvalid 错误,您可以使用 render(action: 'edit') 进行挽救和处理。 阅读您的 cmets 后,我不清楚答案是什么。执行显然是传递到“渲染“编辑”行,因为模型中存在错误,但结果页面上的 URL 与以前不同。 你在edit行动,所以当然不会一样。解决这个问题的唯一方法是使用一些 URL 技巧,例如 HTML5 历史记录操作,或者在提交之前使用 AJAX 远程进行验证,以确保在提交和重定向之前已经很好了。这通常需要更多的工作。 【参考方案1】:

我认为你的假设是不正确的。您问当用户返回表单以纠正错误时,如何防止浏览器栏中的 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)你基本上只有两个选择:

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

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

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

【讨论】:

由于我是 Rails 新手,虽然我编辑了我的问题以包括我的“rake routes”,但我并不完全理解答案是什么。至于“网址不重要,没人真正关心”,我关心,这就是我问这个问题的原因。如果您觉得这很愚蠢或愚蠢,请随意抨击/否决我,或者只是不回答,但我的问题仍然存在。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

但是……

要记住的一点是为什么 Rails 被称为“Rails”。

Rails 之所以称为 Rails,是因为 Rails 的核心设计原则是关于铁路。 Rails 支持约定优于配置,从而使构建网站变得容易,这意味着提供一种且只有一种方式来做事,因此类似于铁路。

作为程序员,当我们选择使用 Rails 时,我们同意坚持使用 Rails 为我们创建的铁轨,以换取简单的编程体验。这就像选择火车而不是汽车一样,您必须保持在轨道上,但作为交换,事情会变得更容易。

因此,每个人的回答很可能都是“不要担心偏离轨道,顺着铁轨走”。

您可以在 Rails 的创建者 DHH 撰写的这篇文章中阅读有关“约定优于配置”和 Rails 设计理念的更多信息 — http://rubyonrails.org/doctrine

【讨论】:

【参考方案4】:

使用这个

redirect_to edit_user_path

【讨论】:

更好,redirect_to edit_user_path(current_user) 这样 Rails 会知道哪个用户【参考方案5】:

即使不推荐,也可以为所欲为:

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

【讨论】:

【参考方案6】:

我怀疑这可能就是你要找的东西。

redirect_to :edit

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

【讨论】:

虽然我添加了“redirect_to :edit”,但它导致了错误,“undefined method `edit_url' for #<0x007fab10d46968>【参考方案7】:

您可以使用以下语法:

redirect_to :back

【讨论】:

那行不通。尽管 URL 相同,但与模型相关的任何错误消息都不会像以前“渲染”时那样显示在视图中。

当用户输入小数点时,如何错误处理我的代码以防止我的程序崩溃?

】当用户输入小数点时,如何错误处理我的代码以防止我的程序崩溃?【英文标题】:HowcanIerrorhandlemycodetopreventmyprogramfromcrashingwhentheuserinputsadecimalpoint?【发布时间】:2014-12-0106:53:49【问题描述】:这是在java中,我的问题是当用... 查看详情

VS Code 中的错误 [无法写入用户设置。请打开用户设置以更正其中的错误/警告,然后重试。]

】VSCode中的错误[无法写入用户设置。请打开用户设置以更正其中的错误/警告,然后重试。]【英文标题】:ErrorinVSCode[Unabletowriteintousersettings.Pleaseopentheusersettingstocorrecterrors/warningsinitandtryagain.]【发布时间】:2021-02-1821:35:07【问题... 查看详情

当表单没有焦点时,如何防止表单处理热键?

...E2应用程序。Form1有热键Ctrl+F,Form2是活动的,没有热键。用户在Form2上按Ctrl+F和Form1处理热键。这是完全不正确的,因为我们看到了非活动形式的活 查看详情

如何防止表单元素值保存在 php 中

...【问题描述】:当使用用户名登录时,密码这些值保存到浏览器缓存中。如何阻止这种情况。【问题讨论】:清除浏览器缓存....!?@MarcGiroux我认为正确的答案是autocompleteattribute浏览器不是正常要求的吗?@MonkeyZeus你可能是 查看详情

如何防止表单在 5 分钟内多次提交?

...我最近发现我的PM系统存在一个巨大的安全问题,它允许用户通过地址栏中的for循环发送任意数量的消息。有人把这个放到地址栏中:javascript:for(x=0;x<10000;x++)$(\' 查看详情

在 iOS 中,如何自动更正提交时的最后一个单词?

...018:59:41【问题描述】:在我的iOS应用程序的聊天屏幕上,用户输入空格后,单词会自动更正。但是当用户点击发送时,最后一个词不会自动更正。当用户点击发送时,如何获取建议的单词来替换拼写错误的单词?【问题讨论】:... 查看详情

当浏览器中的值更改时如何刷新 django 管理表单?

】当浏览器中的值更改时如何刷新django管理表单?【英文标题】:Howrefreshdjangoadminformwhenavaluechangeinthebrowser?【发布时间】:2015-05-0921:34:45【问题描述】:我有一个选择字段,当更改为另一个值时,它必须更改表单中的其他字段。... 查看详情

如何从 C# 中的表单返回值?

...击按钮时通过ShowDialog()显示另一个窗体(frmImportContact)。当用户单击frmImportContact上的“确定”时,我想将一些字符串变量 查看详情

Laravel 如何返回以 HTML 显示的 SQL 错误?

】Laravel如何返回以HTML显示的SQL错误?【英文标题】:LaravelHowdoIreturnbackwithSQLerrorsdisplayedinHTML?【发布时间】:2021-04-0621:28:38【问题描述】:问题我在我的SQL数据库中创建了一个约束来防止重复条目。最初的laravel表单提交工作正... 查看详情

当用户直接导航到页面时,将默认状态传递给链接(代码片段)

...<Link/>组件传递状态中的参数。状态中的此参数告知用户导航到页面后要显示的内容。<Linkto=`/$link`state=dataRef:dataToDisplaykey=j>heading</Link>这很好用。但是,当用户直接导航到页面(在地址栏中插入地址)时,我收到错... 查看详情

当用户单击“打开”时上传文件输入表单

...格截然不同。它不显示“未选择文件”文本。通常的文件浏览器会弹出。用户选择要上传的文件。他们点击文件浏览器中的“打开”按钮。点击“打开”后,文件浏览器将关 查看详情

如何防止刷新后表单服务被删除?

】如何防止刷新后表单服务被删除?【英文标题】:Howtopreventthebeingdeletedformserviceafterrefresh?【发布时间】:2018-02-1607:35:39【问题描述】:我在service中使用$sessionStorage以角度存储日期并在另一个页面中获取它。(我正在使用SPA)... 查看详情

当用户使用其他帐户登录时,如何防止激活应用内订阅?

】当用户使用其他帐户登录时,如何防止激活应用内订阅?【英文标题】:HowdoIpreventactivationofin-appsubscriptionswhenuserlogsinwithadifferentaccount?【发布时间】:2021-04-1119:31:16【问题描述】:我正在开发一个使用Ionic和InAppPurchase2的Android/i... 查看详情

如何编码以防止此错误消息来自正则表达式并通过单击关闭按钮随时关闭该表单?

...家书店创建了Windows窗体应用程序。它有登录表单,如果用户忘记了密码,他可 查看详情

限制导航以防止浏览器在 React App 中挂起

】限制导航以防止浏览器在ReactApp中挂起【英文标题】:ThrottlingnavigationtopreventthebrowserfromhanginginReactApp【发布时间】:2019-11-0204:01:51【问题描述】:我正在使用React进行登录/注册,并且正在使用firebaseauth进行身份验证。当用户登... 查看详情

当条目字段不可见时,如何隐藏 Xamarin 表单中的错误标签?

】当条目字段不可见时,如何隐藏Xamarin表单中的错误标签?【英文标题】:HowtohidetheerrorlabelinXamarinforms,whentheEntryfieldisnotvisible?【发布时间】:2019-12-2718:33:44【问题描述】:我正在尝试创建一个存在验证错误的登录页面。现在,... 查看详情

防止 Word VBA 中的 Excel 提示

...问题描述】:我在Word和Excel上使用VBA。我让Word运行一个用户表单,它会自动打开一个Excel文件。用户应在Excel文件中填写一些数据,然后返回Word用户表单。当用户填写完Word用户表单中的所有字段后,它将在Word上运行一些VBA代码... 查看详情

csrf攻击

...式。在一个img标签里构建一个get请求,当页面被加载时,浏览器便会自动发起一个get请求。<imgsrc="http://xxx.org?value=100">在页面中隐藏一个表单,当用户打开页面时,自动提交这个表单。如:在a标签的href属性里构建一... 查看详情