我的申请表中有问题模型。
应用程序/模型/ question.rb
class Question < ActiveRecord::Base
...
end
我正在使用&#39; pundit&#39;宝石授权。有两个控制器可以对问题进行一些更改:一个用于注册用户,一个用于管理员。
我正在尝试为控制器创建单独的策略。
应用程序/控制器/ questions_controller.rb
class QuestionsController < ApplicationController
...
end
应用程序/策略/ question_policy.rb
class QuestionPolicy < ApplicationPolicy
...
end
应用程序/控制器/管理/ questions_controller.rb
class Admin::QuestionsController < Admin::ApplicationController
...
end
应用程序/策略/管理/ question_policy.rb
class Admin::QuestionPolicy < Admin::ApplicationPolicy
...
end
当我尝试使用&#39;授权&#39; Admin :: QuestionsController中的方法使用app / policies / question_policy.rb类,而不是来自admin文件夹。
Gem的文档说它应该像我上面描述的那样工作(https://github.com/elabs/pundit#namespaced-policies)。
有人可以帮我吗?
答案 0 :(得分:0)
我在github源代码中创建了一个问题,它已经关闭了这样的解释:
文档指的是当前未发布的主分支。您可以通过参考Gemfile中的github源来使用它。
# Gemfile
gem 'pundit', github: 'elabs/pundit'
A bundle install later your code should work.
You can switch back to a released version on Rubygems as soon as 0.3.0 is out. We're still discussing a few namespacing issues, but it will come soon.
答案 1 :(得分:0)
如果有人仍在寻找此功能,我也需要在ActiveAdmin和面向最终用户的网站之间拆分授权。我为controller-based namespaced authorizations构建了一个Pundit兼容的gem(你的策略会起作用),我计划遵循为pundit发布的任何功能。它还包括一个ActiveAdmin适配器。
答案 2 :(得分:0)
我试图为主应用和ActiveAdmin制定单独的政策,并通过创建要在PunditAdapter
config/initializers/active_admin.rb
来获得有效的解决方案
class NamespacedPunditAdapter < ActiveAdmin::PunditAdapter
def get_policy(subject, user, resource)
"ActiveAdmin::#{subject}Policy".constantize.new(user, resource)
end
def retrieve_policy(subject)
case subject
when nil then get_policy(subject, user, resource)
when Class then get_policy(subject, user, subject.new)
else
if subject.class.to_s.split('::')[0] == 'ActiveAdmin'
Pundit.policy!(user, subject)
else
get_policy(subject.class, user, subject)
end
end
end
def scope_collection(collection, _action = Auth::READ)
return collection if collection.class != Class
scope = "ActiveAdmin::#{collection}Policy::Scope".constantize
scope.new(user, collection).resolve
rescue Pundit::NotDefinedError => e
if default_policy_class && default_policy_class.const_defined?(:Scope)
default_policy_class::Scope.new(user, collection).resolve
else
raise e
end
end
end
另一种选择是使用ActiveSupport::Concern
指出here