【问题标题】:How do you implement a function which returns the URL of last visited page你如何实现一个返回上次访问页面的 URL 的函数
【发布时间】:2008-09-19 17:31:33
【问题描述】:

我想将当前 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

我需要实现一个“返回”链接,而不使用 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

【问题讨论】:

  • 现有的视图文件不会阻止您的控制器重定向。
  • 顺便说一句,什么 Rails 版本?

标签: ruby-on-rails ruby


【解决方案1】:

不确定为什么@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)

【讨论】:

  • 不错!我认为@performed_render 确实有效……我的错!我没有想到我的缩略图操作通过 send_file 发送图像,而不是重定向,因此算作渲染,尽管不是渲染页面。它仅由 image_tag 调用。
【解决方案2】:

确定响应是重定向还是渲染的另一种可能方法是检查状态代码:

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 中的方法。

【讨论】:

    【解决方案3】:

    控制器将具有这些变量,这可能会有所帮助:

    @performed_render
    @performed_redirect
    

    但无论如何,您究竟是如何存储 url 的?向我们展示过滤器代码。为什么不使用after_filter

    【讨论】:

    • 我尝试了你的建议但没有成功,尽管我认为这是正确的方向
    【解决方案4】:

    可以更具体一点吗?我无法得到您的问题-通过模板您的意思是渲染:视图,布局?还是仅在使用 render :template 调用时?

    渲染页面? render :action=>:new 也是一个页面...您能更具体地说明您要捕获的内容以及要排除的内容吗?

    看到了接受的答案:)

    【讨论】:

    • 我的意思是渲染一个页面,而不是重定向到另一个动作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    相关资源
    最近更新 更多