mam kontroler w namespace “admin”, w podfolderze ‘admin’. W ten sam sposób grupuję policies pundita, policy dla usera wygląda tak
class Admin::UserPolicy < AdminPolicy
end
Jednak gdy w kontrolerze używam metody ‘authorize’ dostaję wyjątek
unable to find policy UserPolicy
Na zdrowy chłopski rozum widać że pundit o prostu szuka UserPolicy a ja mam Admin::UserPolicy , co mam zrobić żeby on rozpoznawał ten namespace?
Spróbuj dodać w kontrolerze:
require_dependency "app/policies/admin/user_policy"
jeśli dodam to co napisałeś do kontrolera, i wywalę “Admin::” z deklaracji klasy (ale nie plik z folderu admin), dostaję błąd superclass mismatch for class UserPolicy
i już kompletnie nie wiem co się dzieje:)
UPDATE
dobra, to jednak działa, tylko mam wrażenie że dość chałupniczo. błąd ‘superclass mismatch…’ ktory wymienilem powyżej wyskakuje za każdym razem gdy coś zmienię w AdminPolicy lub UserPolicy i musze wtedy restartować serwer żeby załapał zmiany:/
Błąd z przeładowaniem klas zagnieżdżonych jest dość częsty, gdy pracujesz środowisku deweloperskim. Na produkcyjnym nie powinien występować, bo klasy ładują się przed startem aplikacji.
Pewnie korzystasz gdzieś z dynamicznego generowania klas przy pomocy Struct
lub OpenStruct
. Tutaj jest rozwiązanie z wykorzystaniem config.to_prepare
i config.before_initialize
http://alisdair.mcdiarmid.org/2013/02/02/fixing-rails-auto-loading-for-serialized-objects.html