Ruby on rails Rails-使用具有单独管理命名空间的Pundit

Ruby on rails Rails-使用具有单独管理命名空间的Pundit,ruby-on-rails,devise,authorization,ruby-on-rails-5,pundit,Ruby On Rails,Devise,Authorization,Ruby On Rails 5,Pundit,我目前有一个设计和专家在一个封闭的系统中工作得很好,需要用户登录才能看到任何东西 新目标:如何使用Pundit要求AdminUser登录以访问Admin命名空间 我有一个单独的AdminUser模型、单独的管理员控制器、策略和命名空间: routes.rb namespace :admin do root to: 'home#index' resources :users end devise_for :admin_users, skip: [:sessions] as :admin_

我目前有一个设计和专家在一个封闭的系统中工作得很好,需要用户登录才能看到任何东西

新目标:如何使用Pundit要求AdminUser登录以访问Admin命名空间

我有一个单独的AdminUser模型、单独的管理员控制器、策略和命名空间:

routes.rb

namespace :admin do
  root to: 'home#index'
  resources :users
end

devise_for :admin_users, skip: [:sessions]
as :admin_user do
  get 'admin/signin', to: 'admin/devise/sessions#new', as: :new_admin_user_session
  post 'admin/signin', to: 'admin/devise/sessions#create', as: :admin_user_session
  delete 'admin/signout', to: 'admin/devise/sessions#destroy', as: :destroy_admin_user_session
end
class Admin::AdminController < ApplicationController

end
class Admin::HomeController < Admin::AdminController

  def index
    authorize [:admin, :home]
  end

end
控制器/admin/admin\u控制器.rb

namespace :admin do
  root to: 'home#index'
  resources :users
end

devise_for :admin_users, skip: [:sessions]
as :admin_user do
  get 'admin/signin', to: 'admin/devise/sessions#new', as: :new_admin_user_session
  post 'admin/signin', to: 'admin/devise/sessions#create', as: :admin_user_session
  delete 'admin/signout', to: 'admin/devise/sessions#destroy', as: :destroy_admin_user_session
end
class Admin::AdminController < ApplicationController

end
class Admin::HomeController < Admin::AdminController

  def index
    authorize [:admin, :home]
  end

end
策略/admin/home\u policy.rb(管理名称空间的示例子策略)

class Admin::HomePolicy

这两个策略的设置方式与我的用户策略相同,因此不寻找AdminUser。我如何才能使这些功能适用于我的AdminUser模型?

我认为您的思路是正确的。您已经为管理控制器创建了一个命名空间,该命名空间继承自
admin::AdminController
。Pundit将一个名为
Pundit\u user
的助手方法注入到
ApplicationController
中,默认情况下,该方法只返回
当前用户

虽然您可以考虑不使用单独的管理模型,而是使用适当的授权设置,但对于每种情况都可能不方便。我只是想把它摆出来让你想想

我能想到的解决此问题的最简单方法是,简单地重写
Admin::AdminController
中的helper方法,如下所示:

class Admin::AdminController < ApplicationController
  def pundit_user
    current_admin_user
  end
end
class Admin::AdminController

请注意,这确实假设AdminUser模型是沿着

谢谢!我在Github页面上发现了这个片段,并假设它需要在AdminPolicy中。我花了几个小时尝试了无数种方法让它工作,它只需要在控制器中。哦!谢谢你,雅普!