2011-04-29 140 views
49

所有我已經找到了成功登錄與助手 after_sign_in_path_for(resource)設計重定向後登錄失敗

我在網站的索引登錄表單相關的問題,當登錄失敗重定向到「users/sign_in」

但是,當登錄失敗時,如何重定向到我的「網站#索引」?

+6

這個工作適合你嗎?如果是這樣,請標記。 – 2012-03-04 20:17:49

回答

1
+0

謝謝@MikeH,我試過了。 ** devise_for:用戶做 得到 '用戶',:到=> '網站#指數',:爲=>:user_root#導軌3 結束** 運行完美重定向到我的索引所有的情況下,除了當登錄失敗時。在這種情況下,它將重定向到user/sign_in,並且我希望被重定向到「site#index」。 – Juanjo 2011-04-29 22:17:44

+0

嗯。當登錄失敗時,devise的失敗應用程序將重定向到** new _#{scope} _session_path **(您的情況爲new_user_session_path)。當您執行** rake routes **時,此資源路徑會顯示何種控制器/操作? – MikeH 2011-04-30 00:43:14

+4

你找到答案了嗎?我仍在尋找它... – ronnieonrails 2011-07-19 15:12:19

87
  1. 在你的lib目錄下創建一個custom_failure.rb,具有:

    class CustomFailure < Devise::FailureApp 
        def redirect_url 
        your_path 
        end 
    
        def respond 
        if http_auth? 
         http_auth 
        else 
         redirect 
        end 
        end 
    end 
    
  2. 在你設計的初始化,包括:

    config.warden do |manager| 
        manager.failure_app = CustomFailure 
        end 
    
  3. 製作確定Rails將加載到您的lib文件中,位於application.rb中:

    config.autoload_paths += %W(#{config.root}/lib) 
    

不要忘記重新啓動服務器。

我不認爲有一個更簡單的方法來做到這一點。祝你好運。

+2

這沒有奏效。我知道這是來自設計wiki的股票答案。 – dsaronin 2011-11-25 08:53:39

+0

真棒!它適用於我:) – abhijeetmisra 2012-01-10 15:54:30

+0

適合我,太棒了! – 2012-01-25 16:02:31

12

如果您使用自己的SessionsController,你可以在運行warden.authenticate!(auth_options)之前重新分配的auth_options:recall價值回憶你想要的controller#method,例如:

在app /控制器/用戶/ sessions_controller.rb

class Users::SessionsController < Devise::SessionsController 
    #... 
    def create 
    #... 
    auth_options = { :recall => 'site#index', :scope => :user } 
    resource = warden.authenticate!(auth_options) 
    #... 
    end 
    #... 
end 

通過這種方式,您不需要創建定製的FailureApp並修改配置。

+1

這將修改網址爲用戶/ sign_in – Edward 2016-11-04 06:50:57

+0

這是更好的方法。 – 2018-01-19 16:20:29

3

這是色器件3.1.0

Started POST "https://stackoverflow.com/users/sign_in" 
Processing by Devise::SessionsController#create 
Completed 401 Unauthorized 
Processing by Devise::SessionsController#new 

新發生的事情會被調用,因爲在寶石年底確定的auth_options的/設計-3.1.0 /應用/控制器/設計/ sessions_controller.rb

您應該重新定義創建操作中使用的auth_options。我複製在app /控制器/設計/我的Rails應用程序的sessions_controller.rb控制器和更換auth_options方法這樣

def auth_options 
    { :scope => resource_name, :recall => "Home#new" } 
end 

它的伎倆,但URL仍/用戶/ sign_in

我會盡力解決這個問題。

+0

我現在在設計3.2.2上。 Marcao的解決方案非常完美。無需複製和修補設計控制器或設置auth_options。 – pmontrasio 2014-02-14 17:12:15

0

詳細闡述Marcao的答案,我強烈建議在您的CustomFailure響應方法中放置一些debugger以便更好地理解正在發生的事情。

Class CustomFailure < Devise::FailureApp 
    def respond 
    binding.pry 
    super 
    end 
end 

如果你看一下FailureApp Devise Source Code的respond方法是非常容易理解到底是怎麼回事。

def respond 
    if http_auth? 
    http_auth 
    elsif warden_options[:recall] 
    recall 
    else 
    redirect 
    end 
end 

因此,例如,爲了回報你想確保你的respond代碼條件表達式最終返回redirect一個REDIRECT_URL。

但是,如果您想要返回http_auth方法中定義的標準401狀態,您需要驗證您的respond方法代碼返回http_auth

因此,它是值得你考慮的http_auth? 特別的定義,請注意:request.xhr?方法,這會爲JSON請求返回0(記住,0實際上計算結果爲真紅寶石)

def http_auth? 
    if request.xhr? 
    Devise.http_authenticatable_on_xhr 
    else 
    !(request_format && is_navigational_format?) 
    end 
end 

也許檢查您的初始化程序/設計文件爲config.http_authenticatable_on_xhrconfig.navigational_formats爲了控制您想要的響應。這種配置可以真正影響Devise返回的內容,並且通常會導致意外的行爲,這是由於它在這裏所做的。