Получение "невозможно найти политику" при использовании 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 вместо того, чтобы оставаться глобальными в политике вашего приложения.