2014-09-22 2 views
-1

Мне очень нравится идея сделать мои политики ответственными за то, чтобы все переменные были заполнены и действительны, поэтому мы не получаем ничто: ошибки nilClass или аналогичные.Проверить переменную существует с Pundit

Я думал, что это было бы хорошо, чтобы убедиться, что пользователь загрузил файл, используя политику:

Вот мое создать действие:

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 

Он отлично работает, но я хотел бы эту логику, чтобы быть в моем слое политики:/Сначала я думал, что это не может иметь смысл семантически, поскольку это не авторизация, но именно тогда вы думаете об этом, имеет смысл; если пользователь не загрузил файл, у него нет права доступа к действию create.

В любом случае, я хочу эту логику в своем политическом слое. Открыта для всех предложений :)

0

Как работает pundit, он просматривает класс объекта, который вы передаете ему, а затем вызывает эту политику.

Согласно pundit github AUTHORIZE будет вызывать нечто эквивалентное этому (предполагается, что @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

В вашей конфигурации/инициализаторах/файл pundit.rb, вы можете добавить

rescue_from Pundit::NotDefinedError, with: :user_not_authorized 

 Смежные вопросы

  • Нет связанных вопросов^_^