Destructive actions should feel immediate. For delete links inside a list, I return a Turbo Stream that does turbo_stream.remove dom_id(record). That removes the DOM node without re-rendering the rest of the list, which avoids the common “jump” effect. I still keep normal HTML behavior: the destroy action redirects back with a flash message. In the UI, each row/card gets a wrapper id from dom_id. If you need to show an “Undo” affordance, you can append a toast via another turbo stream action. The key detail is returning the correct response type and not relying on JS event handlers to delete the node.