2017-01-17 5 views
0

Rails 4.2 entwickeln und Entwickeln 5Umleitung, wenn signout Schienen

ich dieses code bin mit auf meinem application_controller.rb Benutzer auf die gleiche Seite umleiten, wenn sie

def after_sign_out_path_for(resource_or_scope) 
    request.referrer || root_path 
end 

Werke alles abzumelden Gut, wenn der Benutzer sich abmeldet, wird er sich abmelden und auf der gleichen Seite bleiben.

Wenn Benutzer jedoch versuchen, sich bei fehlgeschlagener Validierung abzumelden, bearbeiten Sie das Profil * Die Anwendung löst einen Fehler aus. das Protokoll sagt „Action :: RoutingError (keine Route treffer [GET] "/ users").

Jede Idee, den Code zu verbessern?

* (zum Beispiel, wenn der Benutzer Benutzernamen zu ändern versucht, und es ist schon Validierungsfehler gemacht, gibt die Form und der Benutzer abmelden)

Antwort

0

Ihr Problem lösen Sie Routing-Fehler wie damit umgehen können:

class ApplicationController < ActionController::Base 
    rescue_from ActionController::RoutingError, with: :handle_routing_error 

    # added 
    def routing_error 
    raise ActionController::RoutingError.new(params[:path]) 
    end 

    private 

    def handle_routing_error 
     redirect_to root_path, alert: "some alert text" 
    end 
end 

Neben hinzufügen sehr Ende von Rails.application.routes.draw Block Ihrer routes.rb

match "*path", to: "application#routing_error", via: :all 

Also, wenn Sie nicht zuletzt besuchten URL haben Sie zurück zu root_path. Wenn Sie die URL zuletzt besucht haben und es gut war, kehren Sie zu ihr zurück. Wenn es nicht gut war (wie Anwendungsfall mit Validierung), kehren Sie zu root_path zurück.

+0

Hallo .. versuchen Sie dies. aber ich kann das zur Arbeit bringen. Entschuldigung :(Einige sagen, Rettung funktioniert möglicherweise nicht [https://coderwall.com/p/whjmra/handling-exceptions-in-your-rails-application] – Aipack

+0

@Aipack.Oh, sorry! Ich habe ein kleines Code-Snippet vergessen, das Sie sollte zu routes.rb und einem mthod in ApplicationController hinzugefügt werden My bad. Aktualisierte die Antwort. Versuchen Sie es jetzt! – VAD

+0

@Aipack. ** PS ** Meine Antwort arbeitet jetzt in meinem eigenen Projekt. So ist es total geprüft. – VAD

0

Sie so etwas tun kann,

def after_sign_out_path_for(resource_or_scope) 
    if current_user 
    request.referrer 
    else 
    root_path 
    end 
end 

Aber was ich tue, ist die gleiche after_sign_out_path_for Methode in application_controller.rb application_controller.rb

mit

def after_sign_out_path_for(resource_or_scope) 
    request.referrer || root_path 
end 

Und fügen Sie dann ein before_action :authenticate_user! Rückruf in Ihrem Controller mit allen Methoden, wo user erforderlich ist. Wie diese

users_controller.rb

class UsersController < ApplicationController 
    before_action :authenticate_user!, only: [:show, :edit, :update, :destroy] 

    def show 
    end 

end 

Auf diese Weise, wenn sich ein Benutzer anmeldet, während auf der Bearbeitungsprofilseite, werden versuchen, ihn auf die gleiche Seite zu umleiten, aber bevor die edit Aktion in users_controller.rb Aufruf Ihrer before_action Rückruf wird aufgerufen und der Benutzer wird automatisch auf die Anmeldeseite umgeleitet.

Das ist absolut was ich bevorzuge, aber Sie wollen es vielleicht nicht, also sollten Sie mit der ersten Lösung gehen.

+0

hallo danke für die Antwort.Ich habe deine erste Lösung ausprobiert, leider gibt es immer noch den gleichen Fehler. Ich habe noch kein user_controller.rb erstellt. Ich benutze Devise Benutzer-Controller, um das Profil zu ändern. es sieht aus wie request.referrer nur den Link, ohne zu wissen, der Controller oder die Aktion zu ergreifen. PATCH /users(.:format) devise/registrations # update – Aipack

+0

Entschuldigung, ich habe meine Antwort aktualisiert, benutze die aktualisierte 'after_sign_out_path_for'-Methode, damit es funktioniert. –

+0

Hallo .. aktualisiert mit Ihrer Antwort, aber jetzt alles auf root_path umleiten, wenn der Benutzer sign_out .. temporäre Ich benutze schmutzig hack 'if URI (request.referer) .path =="/Benutzer "' dann Redirect zu root else Verwendung von Anfrage-Referer. in der 'after_sign_out_path_for'-Methode – Aipack

Verwandte Themen