在Active Admin中使用自定义属性时,应该在pundit相关的文件中给出对应的策略,以确保属性被正确地使用。
例如,考虑一个支持自定义属性的Post模型,并且希望在Active Admin中使用pundit来控制访问。此时,可以在app/policies/post_policy.rb中定义PostPolicy类来包含有关自定义属性的信息:
class PostPolicy < ApplicationPolicy
class Scope < Scope
def resolve
scope.all
end
end
def initialize(user, record)
@user = user
@post = record
end
def show?
true
end
# Allow editing if the user is an admin, or if the post is unpublished
def edit?
@user.admin? || !@post.published?
end
# Allow updating if the user is an admin, or if the post is unpublished
def update?
edit?
end
# Allow creation if the user is an admin, or if the custom flag is set
def create?
@user.admin? || @post.custom_flag?
end
# Allow deletion if the user is an admin, or if the post is unpublished
def destroy?
@user.admin? || !@post.published?
end
end
然后,在Active Admin的配置文件中,继承ActiveAdmin::PunditAdapter并指定正确的策略类:
ActiveAdmin.setup do |config|
config.authorization_adapter = ActiveAdmin::PunditAdapter
config.on_unauthorized_access = :access_denied
config.namespace :admin do |admin|
admin.controller :posts do
include Pundit
# Use a custom policy for the Post model
controller do
def policy_class
PostPolicy
end
end
# The rest of the controller actions...
end
end
end
这样,就可以在Active Admin中使用自定义属性来控制访问。