2015-01-29 3 views
11

Я довольно новым с Rails и у меня есть проблемы со следующими политиками (с использованием Pundit): Я хотел бы сравнить два объекта: @record и @foo, как вы можете увидеть здесь:Пандит политика с двумя входными параметрами

class BarPolicy < ApplicationPolicy 
    def show? 
    @record.foo_id == @foo 
    end 
end 

Я не добираюсь, чтобы найти хороший способ передать второй параметр методам pundit (@foo).

Я хотел бы сделать что-то вроде:

class BarsController < ApplicationController 
    def test 
    authorize bar, @foo, :show? # Throws ArgumentError 
    ... 
    end 
end 

Но метод Пандит авторизированным допускает только два параметра. Есть ли способ решить эту проблему?

Спасибо!

ответ

12

Я нашел ответ на here.

Вот мой способ:

Добавить pundit_user функцию в ApplicationController:

class ApplicationController < ActionController::Base 
include Pundit 
def pundit_user 
    CurrentContext.new(current_user, foo) 
end 

Создать CurrentContext класс:

/lib/pundit/current_context.rb 
class CurrentContext 
    attr_reader :user, :foo 

    def initialize(user, foo) 
    @user = user 
    @foo = foo 
    end 
end 

Обновление метод инициализации Пандит.

class ApplicationPolicy 
    attr_reader :user, :record, :foo 

    def initialize(context, record) 
    @user = context.user 
    @foo = context.foo 
    @record = record 
    end 
end 
+0

Да [это] (https://github.com/elabs/pundit#additional-context) правильный способ его документирования. –

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

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