【问题标题】:How to inherit from Devise Controllers如何从设计控制器继承
【发布时间】:2016-09-25 14:29:40
【问题描述】:

我有一个使用 Devise 进行身份验证的用户模型,还有一个也使用 Devise 的管理员模型。 我希望管理员能够通过 administrators/users/{user.id}/edit 编辑用户配置文件,但是我希望通过设计控制器完成此过程,因此我尝试从 Users::RegistrationsController 继承,如下所示:

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

但我收到以下错误:

找不到路径“/administrators/users”的设计映射。这可能有两个原因:1)您忘记将您的路线包装在范围块内。例如: devise_scope :user do get "/some/route" => "some_devise_controller" end 2) 您正在测试绕过路由器的设计控制器。如果是这样,您可以明确告诉 Devise 使用哪个映射:@request.env["devise.mapping"] = Devise.mappings[:user]

我尝试更改路线,但仍然遇到同样的错误。 你能帮帮我吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 devise


    【解决方案1】:

    从代码重用的角度来看,从 Devise::RegistrationsController 继承可能最初看起来是个好主意,但实际上并不是一个好主意。

    控制器的意图非常不同 - Devise::RegistrationsController 部分处理未经身份验证的用户 - 由于 Devise 内置的灵活性,Devise 控制器是可怕的野兽。

    相反,您应该只设置一个普通的旧 CRUD 控制器,因为与破坏超过一半的 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 
    

    相反,您可能希望专注于通过局部视图重用视图。

    见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 2016-08-14
      • 2014-10-28
      • 2010-11-05
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多