Drag-and-drop reorder can be fancy, but the core is: user triggers a reorder action, server persists positions, and the UI updates. For simpler UIs, I skip drag-and-drop and use up/down buttons. Each click POSTs to a move_up action, updates position, and returns a turbo stream that replaces the whole list. The replacement is cheap if the list is small, and it avoids complex DOM gymnastics. You still get instant feedback and correct server state. If the list is large, you can optimize by replacing only affected rows, but I start with “replace list” because it’s robust and easy to reason about. This also makes accessibility better than drag-and-drop for keyboard users.