2017-02-19 3 views
1

Ich versuche, Devise so zu konfigurieren, dass immer, wenn ein Benutzer, dessen Konto nicht bestätigt wurde, sich anmeldet, er an die new_confirmation_path umgeleitet wird.
Dies ist, was ich bisher habe:Rails, Devise: DoubleRenderError in FailureApp

lib/custom_failure.rb

class CustomFailure < Devise::FailureApp 
    def redirect_url 
     if warden_message == :unconfirmed 
      redirect_to new_user_confirmation_path(q: "unconfirmed") 
     else 
      super 
     end 
    end 
    def respond 
     if http_auth? 
      http_auth 
     else 
      redirect 
     end 
    end 
end 

config/application.rb

config.autoload_paths << Rails.root.join('lib') 

config/initializers/devise .rb

config.warden do |manager| 
    manager.failure_app = CustomFailure 
end 

Leider bekomme ich folgende Fehlermeldung, wenn ein Benutzer anmelden versucht:

AbstractController :: DoubleRenderError in Users :: SessionsController # erstellen

Render und/oder umleiten wurden mehrere Male in dieser genannt Aktion. Bitte beachten Sie, dass Sie nur render oder redirect und höchstens einmal pro Aktion aufrufen können. Beachten Sie auch, dass weder die Weiterleitung noch die Ausführung der Aktion beendet werden. Wenn Sie also eine Aktion nach der Weiterleitung beenden möchten, müssen Sie etwas wie "redirect_to (...) and return" ausführen.

Fehler in lib/custom_failure.rb (um Zeile # 15)

Ich folgte diesem Devise Wiki Page

Antwort

1

Wie der Fehler angegeben, sind Sie ein Doppel machen (rendern oder umleiten) durchgeführt wird. Ich schätze, das ist direkt mit Ihrer redirect_url Methode verbunden.

Mit Blick auf die devise's wiki, gibt es keine Notwendigkeit, eine Umleitung durchzuführen, während die redirect_url Methode überschreiben. Auch durch devise's failure code, am Ende des ausgefallenen Wunsch Überprüfung Ihre Anwendung tut dies:

redirect_to(redirect_url) 
# Which is equal to 
redirect_to(redirect_to(new_user_confirmation_path(q: "unconfirmed"))) 

was falsch ist. Um dies zu beheben, geben Sie in Ihrer redirect_url Überschreibung nur die URL anstelle einer Umleitung an:

class CustomFailure < Devise::FailureApp 
    def redirect_url 
    if warden_message == :unconfirmed 
     # Remove the `redirect_to` call 
     new_user_confirmation_path(q: "unconfirmed") 
    else 
    super 
    end 
    end 

    # ... 
end 
Verwandte Themen