Pundit - разрешить не вызывать, но не выдается ошибка - PullRequest
0 голосов
/ 04 июля 2018

Я использую 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.

Есть идеи, что мне здесь не хватает?

1 Ответ

0 голосов
/ 04 июля 2018

Нашел проблему. Я использовал безопасный доступ &. в версии ruby, в которой он не существует. Удаление исправило это.

...