An improvement to PDug’s answer: To make the spelling correction undoable separately from the insertions, use this:
imap <c-l> <c-g>u<Esc>[s1z=`]a<c-g>u
<c-g>u inserts an undo-break
The rest is the same.
This way, if you don’t like the chosen correction, you can undo it using <Esc>u. Without the undo-breaks, this would undo the complete insertion. Note that the undo-break at the end of the mapping ensures that text added after the correction can be undone separately from the correction itself.
Also, I found it convenient to map this to CTRL+F (which is easy to reach) in both insert and normal mode like this:
imap <c-f> <c-g>u<Esc>[s1z=`]a<c-g>u
nmap <c-f> [s1z=<c-o>
This way, you can quickly fix the last error (relative to the cursor).