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

14ifxucb  于 12个月前  发布在  Ruby
关注(0)|答案(7)|浏览(199)

我使用的是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

zf2sa74q

zf2sa74q1#

我认为你的假设是不正确的。你问 * 我如何防止浏览器栏中的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.渲染一些东西。在动作中渲染视图会保持URL不变(它仍然是/users/:id),但是你可以使用分配给@user的用户来在表单上显示它的错误。这是Rails在更新失败时的默认行为。
1.您可以将浏览器重定向到另一个URL(例如返回到/users/:id/edit或一个完全不同的URL,如主页)。这会改变浏览器地址栏中的URL。但重定向总是会发出一个新的GET请求,这意味着您将丢失通过post发送的信息,并且您将丢失当前分配给@userUser示例。在GET之后,在Rails中,重定向是在更新成功时使用的,如果用户点击浏览器中的reload按钮,则会阻止另一个POST
IMHO,你的问题的答案是:如果不离开Rails选择的路径,不构建一个完全不同的路由、控制器,和表单设置。您需要为GETPATCH配置相同的路由(或POST)请求。控制器方法需要能够以不同的方式处理这两种类型的请求。因为Rails 2.0资源路由是首选方式。你想要什么在Rails 2.0之前很常见
我的建议是:遵循Rails约定。URL并不重要,没有人真正关心。我认为不遵循Rails约定只是为了让表单有另一个URL没有任何好处。

jei2mxaa

jei2mxaa2#

你可以使用这个语法:

redirect_to :back

字符串

ahy6op9u

ahy6op9u3#

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

redirect_to :edit

字符串
http://api.rubyonrails.org/classes/ActionController/Redirecting.html

ljsrvy3e

ljsrvy3e4#

当我开始使用Rails时,我也遇到了同样的问题。
然而...
要记住的一件事是为什么Rails被称为“Rails”。
Rails之所以被称为Rails,是因为Rails的核心设计原则是关于铁路的。Rails通过支持 * 约定而不是配置 * 使构建网站变得容易,这意味着提供一种且只有一种方法来做事情,因此铁路类比。
作为程序员,当我们选择使用Rails时,我们同意坚持使用Rails为我们创造的铁轨,以换取简单的编程体验。这就像选择火车而不是汽车一样,你必须保持在轨道上,但作为交换,事情变得更容易。
因此,大家的回答多半是沿着“别绕轨道,顺着铁轨走就行了”。
您可以在DHH的这篇文章中阅读更多关于“约定优于配置”和Rails设计哲学的内容,他是Rails -http://rubyonrails.org/doctrine的创建者

bvpmtnay

bvpmtnay5#

即使不推荐,也可以做你想做的事情:

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

ecr0jaav6#

使用此

redirect_to edit_user_path

字符串

5lhxktic

5lhxktic7#

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

相关问题