我想将当前网址存储在会话变量中,以引用之前访问过的网页。
如果我存储每个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
我需要实现一个“Go Back”链接,而不使用Javascript,HTTP Referer。对不起如果我应该提到这一点,感谢您的帮助!
更新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
答案 0 :(得分:2)
不确定为什么@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)
答案 1 :(得分:1)
确定响应是重定向还是渲染的另一种可能方法是检查状态代码:
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中的方法。
答案 2 :(得分:0)
可以更具体一点吗?我不能通过模板得到你的问题,你的意思是渲染:视图,布局?或仅在使用render:template?
调用时渲染页面? render:action =&gt;:new也是一个页面...你能更具体地了解你想要捕获哪个以及要排除哪个页面?
看到接受的答案:)
答案 3 :(得分:0)
控制器将具有这些变量,这可能会有所帮助:
@performed_render
@performed_redirect
但无论如何,你究竟是如何存储网址的?向我们展示过滤器代码。为什么不使用after_filter
?