如何从Devise控制器继承

时间:2016-09-25 14:29:41

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

我有一个用户模型,它使用Devise进行身份验证,还有一个管理员模型,它也使用Devise。 我希望管理员能够通过administrators / users / {user.id} / edit编辑用户配置文件,但是我希望通过Devise Controllers完成此过程,因此我尝试从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”=&gt; “some_devise_controller”结束2)您正在测试绕过路由器的Devise控制器。如果是这样,您可以明确告诉Devise使用哪个映射:@ request.env [“devise.mapping”] = Devise.mappings [:user]

我试图改变路线,但我仍然得到同样的错误。 你能帮我吗?

1 个答案:

答案 0 :(得分: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 

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

请参阅: