如何实现一个返回上次访问页面的URL的函数

时间:2008-09-19 17:31:34

标签: ruby-on-rails ruby

我想将当前网址存储在会话变量中,以引用之前访问过的网页。

如果我存储每个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

4 个答案:

答案 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