PointOnPoly constraint is way more robust and versatile than the rivet script , though.
To apply a pointOnPoly constraint, the source object needs UVs.
U and V coordinates are used to accuratly transform the constrainted object on the sourcemesh. (Eg on a vertex, an edge or anywhere on a poly).
When creating UV's it's important that no poly's overlap in UV space (logic because otherwise a UV coordinate represents more than 1 point in 3D space).
So the best method to UV unwrap for use with pointOnPoly is 'automatic Mapping'.
Hope this helps.