2012-04-07 33 views
9

這是我有重定向到默認的網址(myapp_url)。但是我想要改變重定向去請求url是由用戶在認證之後輸入的。 我該怎麼做?我在這裏搜索了幾個選項,例如:back。但是不行。紅寶石軌道 - 重定向到原來的請求url

用戶輸入一個url,如果沒有通過認證,則會被重定向到登錄頁面,然後登錄後用戶將被重定向到原來的請求url。

def create 
    user = User.Authenticate(params[:user_id], params[:password]) 
if user 
    session[:user_id] = user.id 
    redirect_to myapp_url, :notice => "Logged in!" 
else 
    flash.now.alert = "Invalid email or password" 
    render "new" 
    end 

end 
+0

您是否找到解決方案? – 2012-04-24 20:33:24

+0

@ Aldo'xoen'Giambelluca - 還沒有。 – 2012-05-12 10:31:46

+0

此解決方案爲我工作: http://stackoverflow.com/questions/9835365/devise-how-to-redirect-to-different-page-based-on-some-parameter-after-sign-in – rassom 2012-12-07 14:56:07

回答

1

您需要在重定向認證之前保存路徑,並在成功認證後重定向到此路徑。

+0

我試過這個,但沒有運氣。 'session [:return_to] || = request.referer''redirect_to session [:return_to]' – 2012-04-07 07:22:49

12

您可以在Michael Hartl的「Ruby on Rails教程」中閱讀the chapter about "Friendly forwarding",以瞭解如何輕鬆實現它。

基本上你有3種輔助方法:

  1. store_location存儲在會話
  2. redirect_back_or(url)所需位置的用戶將用戶重定向到存儲在會話中的位置,或者,如果沒有設置,該位置包含在所用的「內部」,由redirect_back_or方法來清除這條信息的url方法PARAM
  3. clear_return_to使用一次
當你看到一個guest用戶嘗試訪問需要身份驗證使用 store_location之前他重定向到登錄頁面一個頁面

A):

然後使用這些方法。
B),當用戶登錄,您使用redirect_back_or(url)他重定向到正確的位置(如果當然存在)

這是這項工作怎麼樣,你的想法一個概述,但我建議閱讀(少數)細節。

+0

這可以通過post請求來實現嗎?假設您提交表單並且會話在提交之前過期。 Michael Hartles的例子會導致路由錯誤。我認爲Rails會在登錄後嘗試獲取請求。例如,假設您有'Posts'和'comments',其中的評論嵌套在帖子下,並且評論提交發生在Posts#show中。登錄後產生的URL將是'app.com/posts/1/comments',從而導致路由錯誤,如果請求是POST請求,則不會發生這種情況。 – Mohamad 2012-09-13 17:28:23

+1

重定向由瀏覽器發送爲GET請求。即使您將瀏覽器重定向爲POST,也不會提供原始表單提交數據。 – kgilpin 2014-05-21 17:14:46

+0

答案中的教程鏈接已停用,以下是更新後的鏈接:https://www.railstutorial.org/book/_single-page#sec-friendly_forwarding – Nilloc 2015-12-17 06:46:15