我真的很喜欢让我的政策负责确保所有变量都已填充且有效,因此我们不会得到任何nil:nilClass错误或类似错误。
我认为确保用户使用政策上传文件会很好:
这是我的创作动作:
def create
file = params[:file][:uploaded_file]
authorize file
# removed for brevity
end
这是它的政策:
class AssetPolicy < ApplicationPolicy
def initialize(current_user, record)
@current_user = current_user
@record = record
end
def create?
@record != nil
end
end
但是,我收到以下意外错误:
当文件为零时:
Pundit::NotDefinedError in Admin::Browser::AssetsController#create
unable to find policy NilClassPolicy for
当文件不是零时:
Pundit::NotDefinedError in Admin::Browser::AssetsController#create
unable to find policy ArrayPolicy for [#<ActionDispatch::Http::UploadedFile:0x000000050a2af8]
那么我应该如何检查pundit存在的东西?
答案 0 :(得分:1)
在config / initializers / pundit.rb文件中,您可以添加
rescue_from Pundit::NotDefinedError, with: :user_not_authorized
答案 1 :(得分:0)
我在我的控制器中执行此操作:
file = params[:file][:uploaded_file]
raise Pundit::NotAuthorizedError if file == nil
它运行正常,但我希望这个逻辑在我的策略层中:/起初我认为它在语义上可能没有意义,因为这不是授权的事情,但它是在什么时候你认为它确实有意义;如果用户尚未上传文件,则无权访问创建操作。
无论如何,我想在我的策略层中使用这个逻辑。对所有建议开放:)
答案 2 :(得分:0)
专家的工作方式是查看传递给它的对象的类,然后调用该策略。
根据pundit github授权会调用与此相当的东西(假设@asset属于Asset类):
raise "not authorized" unless AssetPolicy.new(current_user, @asset).create?
因此,为了解决问题,您可以在控制器中执行此操作:
def create
file = params[:file][:uploaded_file]
raise Pundit::NotAuthorizedError unless AssetPolicy.new(current_user, file).create?
# removed for brevity
end