I like this.  Did you enforce the use of the slug on purpose (as opposed to just using find(), which would take the id or the slug)?

Thinking I should probably enforce this on the regular campaign routes as well, just to better hide the id.