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




redirect back (7)

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

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的新手。


Answers

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

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

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


對於那些有興趣的人,這裡是我的實現延伸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

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

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


在您的編輯操作中,將請求的url存儲在會話散列中,該散列可在多個請求中使用:

session[:return_to] ||= request.referer

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

redirect_to session.delete(:return_to)

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

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

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


為什麼redirect_to(:back)不適合你,為什麼它不是?

redirect_to(:back)對我來說就像是一種魅力。 這只是redirect_to(request.env['HTTP_REFERER'])簡捷方式。

http://apidock.com/rails/ActionController/Base/redirect_to Rails 3)或http://apidock.com/rails/ActionController/Redirecting/redirect_to 3)

請注意, redirect_to(:back)在Rails 5中已被棄用。您可以使用

redirect_back(fallback_location: 'something')代替(參見http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html


只是關於any?一個小記錄any? 推薦:他是對的,它通常相當於!empty? 。 但是, any? 將返回true的字符串只是空白(ala " " )。

當然,也請參閱上面的1.9註釋。







ruby-on-rails redirect