The `recordViewForm` (and similar siblings) are very finicky with the `recordId` attribute. Not sure if this is just a quirk or bug but try wrapping it with an `<aura:if isTrue="{! not( empty( v.recordId ) ) }">`

Basically, in my experience working with it, it needs the attribute ready before it's placed in the render cycle.

It just so happens `<aura:if>` doesn't initiate a render of the component until its conditions are truthy.