-1

我真的很喜欢让我的策略负责确保所有变量都被填充和有效的想法,所以我们不会得到任何 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]

那么我应该如何检查权威人士是否存在某些东西?

4

3 回答 3

1

在您的 config/initializers/pundit.rb 文件中,您可以添加

rescue_from Pundit::NotDefinedError, with: :user_not_authorized
于 2015-06-06T14:57:46.777 回答
0

我在我的控制器中这样做:

file = params[:file][:uploaded_file]
raise Pundit::NotAuthorizedError if file == nil

它工作正常,但我希望这个逻辑出现在我的策略层中:/ 起初我认为它在语义上可能没有意义,因为这不是授权的事情,但当你考虑它时它确实有意义; 如果用户尚未上传文件,则他们无权访问创建操作。

无论如何,我希望在我的策略层中使用这个逻辑。接受所有建议:)

于 2014-09-22T11:11:31.293 回答
0

权威人士的工作方式是查看您传递给它的对象的类,然后调用该策略。

根据权威人士的说法,github授权将调用与此等效的东西(假设@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
于 2014-10-24T19:18:58.030 回答