varvet/godmin

Better policy lookups for namespaced models + Pundit

Closed this issue · 1 comments

There are currently some problems with namespaced models and policies, especially in engine installs.

ResourceService#resource_class_name runs demodulize on the class name. That means if you have an Admin::Article model, the Admin::ArticleService will not find it, because it will resolve to ::Article instead.

Similarly, the PolicyFinder adds the namespace twice for namespaced models in engine installs. Admin::Article would resolve to Admin::Admin::ArticlePolicy.

The current solution is to override resource_class_name in Admin::ArticleService and override policy_class in Admin::Article.

We've toyed with the idea of having engine installs expect models to be in the engine, as opposed to the main app. This could be done by removing demodulize in ResourceService#resource_class_name. While this would simplify some things, and make it consistent with how non-engine installs work, it would require engine installs to define a model for each service object, even if these only inherit from the main app model. This would increase the number of files, unless the constants could be dynamically defined somehow.

Also consider migrating to Pundit.

I think we should go ahead with this. More files doesn't really matter. Plus it provides a nice default place to put admin specific logic.