我有一个页面,列出了所有的项目,有可排序的标题和分页。
path:
/projects?order=asc&page=3&sort=code
我选择编辑其中一个项目
path:
projects/436/edit
当我点击页面上的保存时,它会调用projects controller / update方法,在我更新代码后,我想重定向到我点击编辑一个特定项目之前的路径,换句话说,我想在相同的页面上,使用相同的排序。
我看到link_to(:back),认为:back可以在redirect_to(:back)中工作,但这是行不通的。
puts YAML::dump(:back)
yields the following:
:back
我怎样才能让它工作?
9条答案
按热度按时间fnatzsnv1#
在编辑操作中,将请求URL存储在会话哈希中,该哈希可用于多个请求:
然后在成功保存后,在更新操作中重定向到它:
camsedfj2#
为什么
redirect_to(:back)
不适合你,为什么它是一个不去?redirect_to(:back)
对我来说就像一个护身符,它只是redirect_to(request.env['HTTP_REFERER'])
的一个捷径http://apidock.com/rails/ActionController/Base/redirect_to(导轨3之前)或http://apidock.com/rails/ActionController/Redirecting/redirect_to(导轨3)
请注意,
redirect_to(:back)
在Rails 5中已被弃用。改为
redirect_back(fallback_location: 'something')
(请参见http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html)pu82cl6c3#
我喜欢Jaime的方法,但有一个例外,每次重新存储referer对我来说效果更好:
原因是如果你编辑多个对象,你总是会被重定向回你用Jaime的方法存储在会话中的第一个URL。例如,假设我有对象Apple和橙子。我编辑Apple,
session[:return_to]
被设置为该操作的引用。当我使用相同的代码编辑Oranges时,session[:return_to]
不会被设置,因为它已经被定义了。所以当我更新橙子的时候,我会被发送到之前的苹果#编辑操作的引用者。vd2z7a6w4#
这就是我们在应用程序中的操作方式
这样,您只将最后一个GET请求存储在
:return_to
会话参数中,因此所有表单,即使是多次POST,也可以使用:return_to
。iyfjxgzm5#
在rails 5中,按照Rails指南中的说明,您可以用途:
“back”位置是从HTTP_REFERER标头中提取的,不保证浏览器会设置该标头。这就是为什么您应该提供“fallback_location”的原因。
iyr7buue6#
request.referer
由机架设置,设置如下:只要执行
redirect_to request.referer
,它将总是重定向到真正的引用页面,或者root_path('/'),这在通过测试失败时是很重要的,因为direct-nav是指向一个特定的页面,在这个页面中控制器抛出redirect_to:backczfnxgou7#
对于那些感兴趣的人,这里是我的实现,扩展了MBO的原始答案(针对rails 4.2.4,ruby 2.1.5编写)。
llycmphe8#
符号
:back
是你的瑞士军刀。deikduxw9#
我不知道这是否可行
并使用@return_here作为提交表单中的隐藏值。
当然,重新加载将杀死这一点,所以只需根据需要回到默认回退。