Может ли область политики Pundit автоматически применяться к ассоциациям?

#ruby-on-rails #authorization #pundit

Вопрос:

Предположим, у меня есть две модели и две политики:

 class Foo < ApplicationRecord
  has_many :bars
end

class Bar < ApplicationRecord
end

class FooPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      scope.where(user_id: user_id)
    end
  end
end

class BarPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      scope.where(user_id: user_id)
    end
  end
end
 

И у меня есть действие контроллера, чтобы связать эти модели:

 class FoosController < ApplicationController
  def update
    # `authorize` omitted for simplicity

    foo = policy_scope(Foo).find(params[:id])
    foo.update(foo_params)

    head :no_content
  end

  def foo_params
    params.
      require(:foo).
      permit(bar_ids: [])
  end
end
 

Если я хочу сделать так , чтобы пользователь мог связывать Bar записи, которыми он владеет, только с помощью BarPolicy , я могу сделать это следующим образом:

     foo = policy_scope(Foo).find(params[:id])
    bars = policy_scope(Bar).where(id: foo_params[:bar_ids])

    foo.bars = bars
 

Однако это становится утомительным. Существует ли способ автоматического применения областей при назначении связанных записей в контроллере?

(Например, существует ли решение, для которого потребуется только один вызов policy_scope ? Может быть, фильтр по сильным параметрам? Или другие шаблоны, чтобы сделать это менее подробным?)

Комментарии:

1. Это действительно выходит за рамки того, для чего предназначены области знаний экспертов (без каламбура). Пандит на самом деле просто ООП, и он не очень тесно связан с активными записями или даже не осведомлен о таких понятиях, как ассоциации. Способ сделать это, вероятно, заключается в создании метода в вашем классе политики, который принимает список параметров и вносит их в белый список, вместо того, чтобы делать это в вашем контроллере.