1

Ich verwende Devise zusammen mit CanCan/Rolify für die Authentifizierung für meine Rails-Anwendung, und ich habe eine harte Zeit zu verstehen, wie Devise Methoden passieren zu einem Namensraum Controller.undefiniert lokale Variable oder Methode ‚current_user‘ für benannte Steuer

Ich verwende einen Standard users Modell und Controller für den Hauptteil meiner App, alles auf dieser Seite funktioniert gut und gut. Ich habe es jedoch so eingerichtet, dass wenn ein Account mit einem bestimmten role (der nach der Registrierung bestimmt wird) sich mit der Hauptanmeldeseite anmeldet, wird er sie zu namespaced Views und Controllern umleiten.

Lassen Sie uns sagen, dass user_id: 3 anmeldet und auf 0.0.0.0/external/dashboard umgeleitet, ich current_user Methode auf der dashboard Seite nach Umleitung aufrufen Devise des und gibt die richtigen Informationen. Allerdings, wenn ich einen link_to für diesen Benutzer auf der Lage sein, sein Profil bearbeiten bei 0.0.0.0/external/users/3/edit ich die folgende Fehlermeldung:

Started GET "/external/users/3/edit" for 127.0.0.1 at 2017-08-31 21:40:59 -0400 

ActionController::RoutingError (undefined local variable or method `current_user' for External::UsersController:Class) 

routes

devise_for :users, controllers: { confirmations: 'confirmations', registrations: 'registrations' } 

# External routes 
namespace :external do 
    resources :properties, :clients, :orders, :deeds, :mortgages, :users, :owners, :dashboard 
end 

external/dashboard view

<%= user_name_helper(current_user) %> 

user_name_helper (produziert Link Benutzer bearbeiten)

def user_name_helper(user) 
    if user.name.blank? 
    link_to "Update your profile here.", edit_external_user_path(user) 
    else 
    "Hello, #{user.name}" 
    end 
end 

Fehler passiert, wenn ich den Link von diesem Helfer erzeugt klicken.

Aber <%= link_to fa_icon("sign-out", text: "Logout"), destroy_user_session_path, method: :delete %> funktioniert gut von 0.0.0.0/external/dashboard.

So bin ich verwirrt, warum ich current_user in der Ansicht für die External::DashboardController aufrufen kann, aber nicht innerhalb der External::UsersController anrufen kann. Alle namespaced Controller erben direkt von ApplicationController und ich möchte nur eine einzige users model verwenden. Ich habe eine Menge verschiedener Artikel durchforstet, aber ich kann keine Antwort mit einer ähnlichen Konfiguration finden wie meine, also kann mir jeder erklären, was ich falsch machen könnte und wie ich das schaffen könnte die Möglichkeit zu haben, andere Devise methods in meinen Namespaced-Ansichten zu verwenden? Danke im Voraus.

Antwort

0

Welp, ich fand es heraus. Das Problem war, dass ich in meinem external/ Controller eine bedingte before_filter Aufruf wie folgt:

before_filter :client_only unless current_user.has_role? :admin 

Einmal habe ich entfernt, dass alles wie vorgesehen funktioniert. Ich habe noch folgende before_filter an Ort und Stelle, die funktioniert.

before_filter :client_only 

... 

private 

def client_only 
    redirect_to root_path unless current_user.is_client? 
end 

Nicht ganz sicher, warum das bedingte Filter würde nicht so funktionieren, ich es ursprünglich so hatte, wenn jemand irgendwelche Einsicht und fühlt sich an wie zu teilen, dann bin ich ganz Ohr, danke.

Verwandte Themen