如何实现返回上次访问页面的URL的功能
时间:2020-03-06 14:27:03 来源:igfitidea点击:
我想将当前URL存储在会话变量中以引用上一个访问的页面。
如果我存储每个URL(通过ApplicationController上的before_filter),则以重定向结尾(创建,更新等)的操作也被视为最后访问的页面。
有没有一种方法可以告诉Rails如果呈现了模板,则仅执行一个函数?
更新
感谢after_filter技巧...写了太多的before_filters我没发现明显的问题。但是使用@performed_redirect的技巧不起作用-
这就是我到目前为止
class ApplicationController < ActionController::Base after_filter :set_page_as_previous_page def set_page_as_previous_page unless @performed_redirect flash[:previous_page] = request.request_uri else flash[:previous_page] = flash[:previous_page] end end end
我需要实现一个"返回"链接,而不使用Java HTTP引用程序。抱歉,如果我要提一下,谢谢帮助!
更新2
我找到了一个解决方案,该解决方案不是很好,只有在应用程序遵循标准命名方案的情况下才有效
def after_filter if File.exists?(File.join(Rails.root,"app","views", controller_path, action_name+".html.erb")) flash[:previous_page] = request.request_uri else flash[:previous_page] = flash[:previous_page] end end
解决方案
可以更具体一点吗?我不能得到问题的模板,意思是渲染:view,布局?或者仅在使用render:template调用时?
呈现页面? render:action =>:new也是页面...我们能更具体地说明要捕获和排除的内容吗?
看到了可接受的答案:)
控制器将具有以下变量,这可能会有所帮助:
@performed_render @performed_redirect
但是,无论如何,我们究竟如何存储URL?向我们显示过滤器代码。为什么不使用after_filter
?
不确定为什么@performed_redirect不起作用,可以通过在此测试控制器上调用操作来查看它是否存在并具有所需的值:
class RedirController < ApplicationController after_filter :redir_raise def raise_true redirect_to :action => :whatever end def raise_false render :text => 'foo' end private def redir_raise raise @performed_redirect.to_s end end
顺便说一句,而不是做
flash[:previous_page] = flash[:previous_page]
你可以做
flash.keep :previous_page
(我的补丁,那个。回到过去:P)
确定响应是重定向还是渲染的另一种可能方法是检查状态码:
class ApplicationController < ActionController::Base after_filter :set_page_as_previous_page def set_page_as_previous_page unless 302 == request.status #redirecting flash[:previous_page] = request.request_uri else flash[:previous_page] = flash[:previous_page] end end end
似乎确实应该进行重定向? ActionController :: Base中的方法。