2016-09-25 3 views
0

У меня есть пользовательская модель, которая использует Devise для аутентификации, а также имеет модель администратора, которая также использует Devise. Я хочу, чтобы администраторы могли редактировать профиль пользователей с помощью администраторов/пользователей/{user.id}/edit, однако я хочу, чтобы этот процесс выполнялся через Devise Controllers, поэтому я попытался наследовать от Users :: RegistrationsController, как показано ниже :Как наследовать от Devise Controllers

class Administrators::UsersController < Users::RegistrationsController 
before_action :set_user, only: [:show,:edit,:update,:destroy] 
def index 
    @users=User.all 
end 
def show 
end 

def new 
    super 
end 

def update 
    @user.update(user_params) 
    redirect_to [:administrators,:users] 
end 

, но я получаю следующее сообщение об ошибке:

не удалось найти отображение разработать для пути "/ администраторов/пользователей". Это может произойти по двум причинам: 1) Вы забыли обернуть свой маршрут внутри блока области видимости. Например: devise_scope: user do get "/ some/route" => "some_devise_controller" end 2) Вы тестируете контроллер Devise в обход маршрутизатора. Если это так, вы можете явно указать Devise, какое отображение использовать: @ request.env ["devise.mapping"] = Devise.mappings [: user]

Я попытался изменить маршруты, но я по-прежнему получаю ту же ошибку , Не могли бы вы помочь?

ответ

1

Унаследованный от Devise::RegistrationsController может показаться на первый взгляд хорошей идеей с точки зрения повторного использования кода, но это действительно не очень хорошая идея.

Назначение контроллеров очень различно: Devise::RegistrationsController частично занимается неавторизованным пользователем, а контроллеры Devise являются страшными животными из-за гибкости, встроенной в Devise.

Вместо этого вы должны просто установить простой старый контроллер CRUD, поскольку задача под рукой не очень сложна по сравнению с clobbering над половиной Devise::RegistrationsController.

# config/routes.rb 
namespace :administrators do 
    resources :users 
end 

# app/controllers/administrators/base_controller.rb 
module Administrators 

    class AuthorizationError < StandardError; end 

    class BaseController 
    respond_to :html 
    before_action :authenticate_user! 

    # Replace with the lib of your choice such as Pundit or CanCanCan 
    before_action :authorize_user! 
    rescue_from AuthorizationError, with: :unauthorized 

    private 

     def authorize_user! 
     raise AuthorizationError and return unless current_user.admin? 
     end 

     def unauthorized 
     redirect_to new_session_path, alert: 'You are not authorized.' 
     end 
    end 
end 

class Administrators::UsersController < Administrators::BaseController 

    before_action :set_user, only: [:show,:edit,:update,:destroy] 

    def show 
    end 

    def index 
    @users = User.all 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.create(user_params) 
    respond_with(:administrators, @user) 
    end 

    def edit 
    end 

    def update 
    @user.update(user_params) 
    respond_with(:administrators, @user) 
    end 

    def destroy 
    @user.destroy 
    respond_with(:administrators, @user) 
    end 

    private 

    def user_params 
     params.require(:user).permit(:email, :password, :password_confirmation) 
    end 
end 

Вместо этого вы можете сосредоточиться на повторное использование мнения через обертонов, например.

См:

Смежные вопросы