代码之家  ›  专栏  ›  技术社区  ›  easement

如何重定向到RubyonRails中的前一页?

  •  172
  • easement  · 技术社区  · 14 年前

    我有一个页面,列出了所有具有可排序标题和分页的项目。

    path:
    /projects?order=asc&page=3&sort=code
    

    我选择编辑其中一个项目

    path:
    projects/436/edit
    

    当我在那个页面上单击保存时,它调用项目控制器/更新方法。更新代码后,我想重定向到单击“编辑特定项目”之前所在的路径。换句话说,我希望在同一个页面上进行相同的排序。

    我看到链接到(:back)并认为:back可能在重定向到(:back)中起作用,但这是不可行的。

    puts YAML::dump(:back) 
    yields the following:
    :back 
    

    关于我如何才能让这个工作的任何想法。这似乎是一个很容易解决的问题,但我对RoR还是个新手。

    7 回复  |  直到 7 年前
        1
  •  309
  •   Uko    11 年前

    在编辑操作中,将请求的URL存储在会话哈希中,该哈希可用于多个请求:

    session[:return_to] ||= request.referer
    

    然后在成功保存之后,在更新操作中重定向到它:

    redirect_to session.delete(:return_to)
    
        2
  •  95
  •   Pascal    7 年前

    为什么 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)

    请注意 重定向至(:上一步) 在Rails 5中被弃用。你可以使用

    redirect_back(fallback_location: 'something') 取而代之(见) http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html )

        3
  •  45
  •   Community Egal    13 年前

    我喜欢Jaime的方法,但有一个例外,每次重新存储引用者对我来说效果更好:

    def edit
        session[:return_to] = request.referer
    ...
    

    原因是,如果编辑多个对象,您将始终被重定向回使用jaime方法存储在会话中的第一个URL。例如,假设我有苹果和橘子的物体。我编辑苹果和 session[:return_to] 设置为该操作的引用者。当我用同样的代码编辑橙子时, 会话[:返回到] 无法设置,因为它已定义。因此,当我更新橙色时,我将被发送到上一个苹果编辑操作的引用程序。

        4
  •  33
  •   MBO    11 年前

    这就是我们在应用程序中的方法

    def store_location
      session[:return_to] = request.fullpath if request.get? and controller_name != "user_sessions" and controller_name != "sessions"
    end
    
    def redirect_back_or_default(default)
      redirect_to(session[:return_to] || default)
    end
    

    这样,您只存储最后一个GET请求 :return_to 会话参数,因此所有表单,即使在多次发布时也可以使用 返回到 .

        5
  •  18
  •   Steve Tipton    13 年前

    request.referer 由机架设置,设置如下:

    def referer
      @env['HTTP_REFERER'] || '/'
    end
    

    只做一个 redirect_to request.referer 它将始终重定向到真正的引用页或根路径(“/”)。当直接导航到控制器抛出重定向至:返回的特定页面时,通过失败的测试时,这一点非常重要。

        6
  •  13
  •   pSkarl    8 年前

    在Rails 5中,根据Rails Guides中的说明,可以使用:

    redirect_back(fallback_location: root_path)
    

    “back”位置是从HTTP引用头中提取的,浏览器不保证设置该头。这就是为什么你应该提供一个“回退位置”。

        7
  •  1
  •   aschyiel    8 年前

    对于那些感兴趣的人,下面是我扩展MBO原始答案的实现(写在Rails 4.2.4、Ruby2.1.5上)。

    class ApplicationController < ActionController::Base
      after_filter :set_return_to_location
    
      REDIRECT_CONTROLLER_BLACKLIST = %w(
        sessions
        user_sessions
        ...
        etc.
      )
    
      ...
    
      def set_return_to_location
        return unless request.get?
        return unless request.format.html?
        return unless %w(show index edit).include?(params[:action])
        return if REDIRECT_CONTROLLER_BLACKLIST.include?(controller_name)
        session[:return_to] = request.fullpath
      end
    
      def redirect_back_or_default(default_path = root_path)
        redirect_to(
          session[:return_to].present? && session[:return_to] != request.fullpath ?
            session[:return_to] : default_path
        )
      end
    end