我使用的是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
型
7条答案
按热度按时间zf2sa74q1#
我认为你的假设是不正确的。你问 * 我如何防止浏览器栏中的URL更改时,用户返回到一个表单,以纠正错误?*
答案是:当用户再次看到表单以纠正错误时,浏览器中的URL不会更改。因为第一次发送表单时,URL已经更改。
如果
routes.rb
遵循常见约定,则会有以下路由(使用rails routes
列出它们):字符串
当您向
/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
发送的信息,并且您将丢失当前分配给@user
的User
示例。在GET
之后,在Rails中,重定向是在更新成功时使用的,如果用户点击浏览器中的reload按钮,则会阻止另一个POST
。IMHO,你的问题的答案是:如果不离开Rails选择的路径,不构建一个完全不同的路由、控制器,和表单设置。您需要为
GET
和PATCH
配置相同的路由(或POST
)请求。控制器方法需要能够以不同的方式处理这两种类型的请求。因为Rails 2.0资源路由是首选方式。你想要什么在Rails 2.0之前很常见我的建议是:遵循Rails约定。URL并不重要,没有人真正关心。我认为不遵循Rails约定只是为了让表单有另一个URL没有任何好处。
jei2mxaa2#
你可以使用这个语法:
字符串
ahy6op9u3#
我想这可能就是你要找的东西。
字符串
http://api.rubyonrails.org/classes/ActionController/Redirecting.html
ljsrvy3e4#
当我开始使用Rails时,我也遇到了同样的问题。
然而...
要记住的一件事是为什么Rails被称为“Rails”。
Rails之所以被称为Rails,是因为Rails的核心设计原则是关于铁路的。Rails通过支持 * 约定而不是配置 * 使构建网站变得容易,这意味着提供一种且只有一种方法来做事情,因此铁路类比。
作为程序员,当我们选择使用Rails时,我们同意坚持使用Rails为我们创造的铁轨,以换取简单的编程体验。这就像选择火车而不是汽车一样,你必须保持在轨道上,但作为交换,事情变得更容易。
因此,大家的回答多半是沿着“别绕轨道,顺着铁轨走就行了”。
您可以在DHH的这篇文章中阅读更多关于“约定优于配置”和Rails设计哲学的内容,他是Rails -http://rubyonrails.org/doctrine的创建者
bvpmtnay5#
即使不推荐,也可以做你想做的事情:
render
显示错误/users/edit
创建路由PUT或PATCHform_for
参数)hidden_field_tag
参数current_user
函数ecr0jaav6#
使用此
字符串
5lhxktic7#
保持
show
和edit
模板相同,这两个目的都可以使用,编辑时实际上是编辑页面,否则视为显示页面,当有错误可用时,它将显示错误