#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. Это действительно выходит за рамки того, для чего предназначены области знаний экспертов (без каламбура). Пандит на самом деле просто ООП, и он не очень тесно связан с активными записями или даже не осведомлен о таких понятиях, как ассоциации. Способ сделать это, вероятно, заключается в создании метода в вашем классе политики, который принимает список параметров и вносит их в белый список, вместо того, чтобы делать это в вашем контроллере.