2014-09-22 68 views
-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] 

所以我应该怎么检查的东西与权威人士的存在呢?

回答

0

我在做这在我的控制器:

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

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

无论如何,我想在我的策略层的这个逻辑。开放给所有的建议:)

0

专家的工作方式是看看你传递给它的对象的类,然后调用该策略。

按照pundit 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 
1

在你的config /初始化/ pundit.rb文件,你可以添加

rescue_from Pundit::NotDefinedError, with: :user_not_authorized