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.