Получение "невозможно найти политику" при использовании pundit и Rails 5

Я использую Rails 5 и хочу использовать pundit для авторизации моих объектов. Я добавил этот драгоценный камень в свой Gemfile и поместил его в мой файл application_controller.rb

class ApplicationController < ActionController::Base

  # Needed for proper authorization
  include Pundit

И я создал файл политики приложения здесь - app /icies/application_policy.rb

class ApplicationPolicy
  attr_reader :user, :record

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

  def index?
    false
  end

  def show?
    scope.where(:id => record.id).exists?
  end

  def create?
    false
  end

  def new?
    create?
  end

  def update?
    @record.user == @user
  end

  def edit?
    update?
  end

  def destroy?
    @record.user == @user
  end

а затем у меня есть пустой файл MyEventPolicy (app/icies/my_event_policy.rb)

class MyEventPolicy < ApplicationPolicy
end

Затем в моем файле app/controllers/my_event_controller.rb я

  def edit
    @my_event = MyEvent.find(params[:id]) 
    authorize @my_event

Но когда я вызываю вышеупомянутое, я получаю сообщение об ошибке в строке "authorize", жалуясь на

unable to find policy `MyEventPolicy` for `#<MyEvent id: 1, ...

Что еще мне не хватает в моей настройке, чтобы заставить это работать должным образом?

Изменить: вот что находится в моем файле app / models / user.rb...

class User < ActiveRecord::Base
  has_many :assignments
  has_many :roles, through: :assignments

  def role?(role)
    roles.any? { |r| r.name.underscore.to_sym == role.to_s.underscore.to_sym }
  end

  def admin?
    role? "Admin"
  end

  def name
    name = first_name
    if !first_name.nil?
      name = "#{name} "
    end
    "#{name}#{last_name}"
  end

  def self.from_omniauth(auth)
    puts "auth id: #{auth.uid} provider: #{auth.provider}"
    user = find_or_create_by(uid: auth.uid, provider: auth.provider)
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.first_name = auth.info.first_name
    user.last_name = auth.info.last_name
    user.oauth_token = auth.credentials.token
    user.oauth_expires = auth.credentials.expires_at.nil? ? nil : Time.at(auth.credentials.expires_at)
    user.save!
    user
  end

end

1 ответ

Разве это не должно быть запись и пользователь для обновления? и уничтожить? действия политики вместо @user/@record? Затем авторизуйте @user/@record в действиях вашего контроллера, как написано в README.md

Кроме того, создайте специальные политики для вашего класса событий в EventPolicy вместо того, чтобы оставаться глобальными в политике вашего приложения.

Другие вопросы по тегам