Rails 7.0.0.rc1’ı deniyorum da. Scaffold ile basit blog uygulaması oluşturdum ama model entry’sini silme yani destroy’da confirmation model açılması gerekirken açılmıyor ve veri direk siliyor.
<%= button_to 'Destroy this post', post_path(@post), method: :delete, data: { confirm: "Are you sure you want to delete this post?" }, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %>
kod olarak bu var. Anladığım kadarıyla application.js içinde ujs olmadığı için bu confirmation modal açılmıyor. Bunu stimulus içinde elle mi yapmak lazım? Siz fark ettiniz mi daha önce? ya da ujs mi eklemek lazım?
Biraz ezbere yapmış olabilirim. Anladığım kadarıyla burada controller’a istek as TURBO_STREAM olarak gidiyor ve turbo_stream bir format’ta respond vermesini istiyoruz. Burada işler en azından benim için biraz karışıyor. Belki daha basit bi çözüm vardır.
Cevabı telefondan denemeden test etmeden göndermiştim. Gözümden birşey kaçmış olabilir. İlk fırsatta kontrol edip çalışan versiyonu sana iletirim.
Birde sanırım belirtmeyi atladığım bir konu da button_to form build ediyor ve helper içerisinden delete method belirtince doğrudan çalışmıyordu. Onların tüm hepsinin çözümü bende mevcut fakat şu an hatırlayamıyorum
GET harici istekler için link_to yerine form veya button_to Helper’ları tercih etmek gerekiyor.
Turbo’nun son versiyonlarında bu konuları tartışıp yeniden dokümanter etmişler.
Dolayısı ile bir destroy işlemi için eğer button veya linke benzer bir yapı kurulacak ise bunu button_to helper ile method: :delete setleyerek yapmak ve bir form build etmek gerekiyor. Bu zaten varsayilan rails konfigurasyonunda çalışan bir durum. Sorun bu buton’a confirm mesaj eklemeye gelince yeni eklenen data-turbo-confirm parametresinin bu helper içerisinden eklendiğinde formun içinde oluşan submit buton’a eklenmesi ve turbo’nun bunu yakalayaması. Çalışması için data-turbo-confirm: “Mesaj” parametresinin tag içerisine eklenmesi gerekiyor.
Özetlemem gerekirse. button_to kullanarak method: :delete kullanarak işleme devam etmelisin fakat confirm parametresini form elementine vermelisin. Bunun için aşağıdaki kullanım işini görecektir;
<%= button_to "Destroy this book", book_path(@book), method: :delete, form: { data: { turbo_confirm: 'Are you sure? '} } %>
Bu arada evet. Link’leri turbo ile kullanır ve method’ları setlersen karşı tarafta turbo_stream olarak yakalaman gerecektir ama burada senaryoda sen destroy sonras redirection istiyorsan turbo_stream response üretmen gerekmiyor. Turbo_stream response üretip bir elementi dom’dan silmen veya başka bir senaryo ile birşeyler yapman gerektiğinde verdiğin örnek daha anlamlı olacaktır. Umarım aradaki farkı anlatabilmişimdir
Bonus dipnot: Eğer UJS alışkanlıklarımı birakamam dersen Turbo ile birlikte UJS’de kullanmaya devam edebilirsin. (En azından son güncellemelerden önce öyleydi, belki halen çalışır ) O zaman eski yöntem data-confirm’ler de çalışır. Bunun için “@rails/ujs” kurmalı ve application.js dosyana import Rails from "@rails/ujs"; eklemen gerekecektir.