我有一个用户模型,它使用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]
我试图改变路线,但我仍然得到同样的错误。 你能帮我吗?
答案 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
相反,您可能希望专注于通过部分重用视图。
请参阅: