Я использую pundit для авторизации. Он работает не так, как ожидалось, но при вызове authorize
не выдается никакой ошибки, чтобы сказать «нет метода».
Спецификация:
it "should let a user destroy their own picture" do
sign_in(user2)
expect do
delete :destroy, { id: p1.id }
expect(response.status).to eq(200)
end.to change { Picture.count }.by(-1)
end
it "should not let a user delete another user's picture" do
sign_in(user2)
expect do
delete :destroy, { id: p1.id }
expect(response.status).to eq(403)
end.to change { Picture.count }.by(0)
end
ApplicationController:
class ApplicationController < ActionController::Base
...
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
...
end
PicturesController:
class PicturesController < ApplicationController
def destroy
@picture = Picture.find_by_id(params[:id])
authorize(@picture)
@picture.destroy
redirect_to pictures_path
end
end
ApplicationPolicy
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end
def scope
Pundit.policy_scope!(user, record.class)
end
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
scope
end
end
end
PicturePolicy
class PicturePolicy < ApplicationPolicy
def destroy?
@user&.id == @record&.user_id
end
end
Когда я запускаю свой тест со строкой authorize(picture)
, ни один не уничтожается, без него оба уничтожаются. При добавлении некоторых операторов put внутри PicturePolicy#destroy?
они не отображаются. Если я добавлю ApplicationPolicy#destroy?
, он тоже не будет вызываться. Однако, когда я добавляю authorize(obj)
к своему контроллеру, после запуска этого кода ничего не выполняется, не выполняется ни одна политика # авторизация, а возвращается 200.
Есть идеи, что мне здесь не хватает?