to中文 - 如何在Ruby On Rails中重定向到上一頁?




redirect_to path (5)

request.referer由Rack設置,設置如下:

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

只要做一個redirect_to request.referer ,它會一直重定向到真正的引用頁面,或者是root_path('/')。 這在將direct-nav情況下失敗的測試傳遞給控制器拋出redirect_to的特定頁面時非常重要:back

我有一個列出所有具有可排序標題和分頁的項目的頁面。

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

我選擇編輯其中一個項目

path:
projects/436/edit

當我點擊該頁面上的保存時,它會調用項目控制器/更新方法。 在我更新代碼之後,我想要重定向到我所在的路徑,然後單擊編輯特定項目。 換句話說,我想在同一頁面上進行相同的排序。

我看到link_to(:back),並認為:back可能在redirect_to(:back)中工作,但那是不行的。

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

關於我如何才能使這個工作的任何想法。 這似乎是一個很容易解決的問題,但我是RoR的新手。


在rails 5中,按照Rails指南中的說明,您可以使用:

redirect_back(fallback_location: root_path)

'返回'位置是從HTTP_REFERER頭部提取的,不保證被瀏覽器設置。 這就是為什麼你應該提供'fallback_location'。


對於那些有興趣的人,這裡是我的實現延伸MBO的原始答案(寫入軌道4.2.4,紅寶石2.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

我喜歡Jaime的方法,只有一個例外,它對我來說每次都重新存儲引用者會更好:

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

原因是,如果您編輯多個對象,您將始終使用Jaime的方法重定向回到您存儲在會話中的第一個URL。 例如,假設我有Apple和Orange的對象。 我編輯Apple, session[:return_to]被設置為該動作的引用者。 當我使用相同的代碼編輯橘子時, session[:return_to]將不會被設置,因為它已被定義。 因此,當我更新橙色時,我將被發送給之前Apple#編輯動作的引用者。


這就是我們在應用程序中的做法

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會話參數中,所以所有表單即使在多次POST時也能用於:return_to







redirect