2016-11-22 1 views
0

Ich habe eine einfache Anwendung erstellt, die mit DB interagiert und CRUD-Operationen darin ausführt, nachdem ein Benutzer authentifiziert und autorisiert wurde. Früher funktionierte es, als es eine einzige Tabelle gab, aber sobald ich mit verschachtelten Relationen und Authentifizierungsmechanismen zu spielen begann, bekam ich den Fehler. Bis jetzt glaube ich, dass ich alles richtig gemacht habe. Hier ist der Screenshot des Fehlers:Ruby on Rails gibt Fehler aus, wenn Weiterleitungen zu root_path oder login_path sind

enter image description here

Hier ist mein routes.rb:

Rails.application.routes.draw do 
root to: "todo_lists#index" 

    resources :todo_lists do 
    resources :todo_items 
    end 

    resources :sessions, only: [:new, :create, :destroy] 
    get "/login" => "sessions#new", as: "login" 
    delete "/logout" => "sessions#destroy", as: "logout" 
end 

Meine Sitzungssteuerung:

class SessionsController < ApplicationController 
     def new 
     end 

     def create 
     @user = User.find_by(username: params[:username]) 
     @password = params[:password] 
     end 

     if @user && @user.authenticate(password) 
     session[:user_id] = @user.id 
     redirect_to root_path, notice: "Logged in successfully" 
     else 
     redirect_to login_path, alert: "Invalid Username/Password combination" 
     end 

     def destroy 
     reset_session 
     redirect_to login_path, notice: "You have been logged out" 
     end 
    end 

Oh, und ich änderte die Application so die Routen sollten Arbeit dennoch:

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 

    before_action :ensure_login 
    helper_method :logged_in?, :current_user 

    protected 
     def ensure_login 
     redirect_to login_path unless session[:user_id] 
     end 

     def logged_in? 
     session[:user_id] 
     end 

     def current_user 
     @current_user ||= User.find(session[:user_id]) 
     end 
end 

Antwort

0

ich den Code falsch ist in create Verfahren und root_path ist keine Klassenmethode, ist eine Instanzmethode:

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    @user = User.find_by(username: params[:username]) 
    @password = params[:password] 
    end # <--- here create method finish. Where this end comes from? 

    if @user && @user.authenticate(password) 
    session[:user_id] = @user.id 
    # root_path is defined for an instance 
    # of a controller, not for the class 
    redirect_to root_path, notice: "Logged in successfully" 
    else 
    redirect_to login_path, alert: "Invalid Username/Password combination" 
    end 

    def destroy 
    reset_session 
    redirect_to login_path, notice: "You have been logged out" 
    end 
end 
+0

Danke, Das war so dumm von mir. –

-1

Haben Sie versucht, root_url anstelle von root_path in Ihrem SessionsController zu verwenden?

HTTP benötigt eine vollqualifizierte URL, wenn eine 302-Weiterleitung ausgeführt wird. Die Methode _url bietet einen absoluten Pfad einschließlich Protokoll und Servername. Die Methode _path bietet einen relativen Pfad, wobei derselbe Server und dasselbe Protokoll wie die aktuelle URL angenommen wird.

Versuchen Sie, auf root_url zu wechseln und lassen Sie mich wissen, wenn sich etwas ändert!

Bearbeiten: Der Grund, den ich vorschlagen, einen absoluten Pfad verwenden, ist, weil Sie erwähnten, die Umleitung funktionierte gut mit nur einer Tabelle, bevor Sie eine andere Tabelle und verschachtelte Routen hinzugefügt.

Bearbeiten: Eine andere Sache, die ich bemerkte, ist der Authentifizierungsblock unten ist nicht innerhalb der sessions#create Route platziert, wie Sie erwarten würden.

if @user && @user.authenticate(password) 
    session[:user_id] = @user.id 
    redirect_to root_path, notice: "Logged in successfully" 
else 
    redirect_to login_path, alert: "Invalid Username/Password combination" 
end 

Gibt es einen Grund, dass es außerhalb einer Methode existiert? Versuchen Sie, es zurück in die Erstellungsroute zu verschieben.

+0

Ich habe es versucht. Den gleichen Fehler mit _url erhalten. –

+0

Okay. Sie können auch 'include Rails.application.routes.url_helpers' zum' SessionsController' hinzufügen. Wenn das nicht funktioniert, werde ich weiter suchen! – Gundam194

+0

Eine andere Sache, die ich bemerkte, ist die Benutzerauthentifizierung Block – Gundam194

0

zum Umleiten Ihre Logik ist außerhalb des Blocks Methode:

if @user && @user.authenticate(password) 
    session[:user_id] = @user.id 
    redirect_to root_path, notice: "Logged in successfully" 
    else 
    redirect_to login_path, alert: "Invalid Username/Password combination" 
end 

Dieser Code sollte vor der endgültigen end des create Methode