2016-09-25 18 views
0

私はDeviseを認証に使用するユーザーモデルを持っており、Deviseも使用する管理者モデルを持っています。 管理者が管理者/ユーザー/ {user.id}/editを使用してユーザープロファイルを編集できるようにしたいが、このプロセスをDevise Controllersで実行したいので、以下のようにUsers :: RegistrationsControllerから継承しようとしました:Deviseコントローラから継承する方法

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 

が、私は次のエラーを取得する:

は "/管理者/ユーザーの" パスのマッピングを工夫見つかりませんでした。これは、2つの理由で発生する可能性があります。1)スコープブロック内にルートをラップするのを忘れた。例:devise_scope:user do/"/ some/route" => "some_devise_controller" end 2)ルータをバイパスしてDeviseコントローラをテストしています。そうであれば、Deviseにどのマッピングを使用するかを明示することができます:@ request.env ["devise.mapping"] = Devise.mappings [:user]

私は経路を変更しようとしましたが、 。 私を助けてもらえますか?

答えて

1

Devise::RegistrationsControllerから継承することは、最初はコードの再利用の観点からは良いアイデアのように見えるかもしれませんが、実際はあまり良い考えではありません。

コントローラーの意図は非常に異なります。Devise::RegistrationsControllerは部分的に未認証のユーザーを扱い、DeviseコントローラーはDeviseに組み込まれた柔軟性のために恐ろしい獣です。

Devise::RegistrationsControllerの半分をこすったのと比べて、手元のタスクはそれほど複雑ではないので、代わりにプレーンな古いCRUDコントローラをセットアップするだけですみます。


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 

代わりにあなたが例えばパーシャルてビューを再利用に集中したいことがあり


# 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 
# config/routes.rb 
namespace :administrators do 
    resources :users 
end 

参照:

関連する問題