4 ms·
Kudos on picking up and moving forward an existing Rails plugin gem rather than writing yet another. Too many Rails gems get left in the dust after a few years.
by timmorgan 12y ago
Kudos on picking up and moving forward an existing Rails plugin gem rather than writing yet another. Too many Rails gems get left in the dust after a few years. CanCan is a great library, and is well-documented!
That being said, I've found (the hard way) that how CanCan declares "abilities" isn't flexible enough. The declarations got out of hand as my app grew larger and the maze of who can do what got more complex.
CanCan tries to reduce complex authorization logic down to a very simple DSL. I applaud the effort, but it falls apart on larger apps.
(I am perfectly willing to admit that I probably just "did it wrong", but in the end, I decided something less clever and more along the lines of "just Ruby" would be more up my alley.)
I've switched over to using the Authority gem [1] for authorization, which doesn't try to be quite so clever. You write your authorization logic in plain ol' Ruby code -- use an `if` or a `case` or look up in the database, or whatever!
The best part of CanCan (IMO) is its ability to load and authorize your resource model in a filter in your controller, removing much of the boilerplate you get with Rails resource controllers. I would hope that functionality could be extracted from CanCan (or CanCanCan) into a separate gem.
In the meantime, I ended up writing my own library called (unimaginatively) "load_and_authorize_resource" [2] to do basically the same thing. Feedback (and PRs) welcome.
[1] https://github.com/nathanl/authority https://github.com/nathanl/authority
[2] https://github.com/seven1m/load_and_authorize_resource https://github.com/seven1m/load_and_authorize_resource
- d4mi3n 12y agoHaven't heard of authority before, thanks for the link. I've been using Pundit [1] for similar problems; assuming you're aware of both projects, were there any specific issues that caused you to go with authority over Pundit? [1] https://github.com/elabs/pundit https://github.com/elabs/pundit
- riffraff 12y agocan you share an example of code that you had issues expressing with CanCan?