我正在使用 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
我认为你的假设是不正确的。您问当用户返回表单以更正错误时,如何防止浏览器栏中的 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
),你基本上只有两个选择:
/users/:id
),但您可以更改为使用分配给 @user
的用户,例如在表单上显示其错误。这是更新失败时 Rails 的默认行为。/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 没有任何好处。
您可以使用以下语法:
redirect_to :back
我怀疑这可能就是您正在寻找的。
redirect_to :edit
http://api.rubyonrails.org/classes/ActionController/Redirecting.html
当我开始使用 Rails 时,我也遇到了同样的问题。
但是……
需要记住的一件事是记住为什么 Rails 被称为“Rails”。
Rails之所以称为Rails,是因为Rails的核心设计原则是关于铁路的。 Rails 通过“约定优于配置”使构建网站变得容易,这意味着提供一种且唯一的一种做事方式,因此可以用铁路来比喻。 作为程序员,当我们选择使用 Rails 时,我们同意坚持使用 Rails 为我们创建的铁轨,以换取轻松的编程体验。这就像选择火车而不是汽车一样,你必须保持在轨道上,但作为交换,事情会变得更容易。
因此大家的答案很可能都是“不用担心偏离轨道,沿着铁轨走就行了”。
您可以在 Rails 的创建者 DHH 的这篇文章中阅读更多有关“约定优于配置”和 Rails 设计理念的文章 —
http://rubyonrails.org/doctrine使用
render
/users/edit
form_for
hidden_field_tag
current_user
redirect_to edit_user_path
show
和
edit
模板相同,这两个目的都可以,编辑时实际上是编辑页面,否则视为显示页面,当有错误时,它会显示错误