Rails 7.0.0.rc1

Merhaba :wave:

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?

Sevgiler.

@eayurt merhaba,

UJS artık desteklenmiyor ve Rails içerisinden kaldırıldı.

Eski UJS özelliklerinin çoğunu Turbo içerisine eklediler. Confirm mesajları da ya data-method gibi parametreler kullanım olarak değiştiler.

Bu kodu şu şekilde düzeltirsen çalışması gerekir;

<%= button_to 'Destroy this post', post_path(@post), data: { turbo_confirm: "Are you sure you want to delete this post?", method: “delete” }, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %>

Kaynaklar:

Sevgilerimle.

Cevap için teşekkürler ancak bu gönderdiğin çalışmadı.

https://www.driftingruby.com/episodes/hotwire-turbo-replacing-rails-ujs şöyle bir video buldum. Bu da tam olmadı ama şu şekilde yapınca en azindan confirmation modal açılıyor ve veri silinebiliyor. Sadece doğru path’e redirect etmiyor.

# show.html.erb
<%= link_to 'Destroy this post', post_path(@post), 'data-turbo-confirm': "Are you sure you want to delete this post?", "data-turbo-method": "delete", class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %>
# posts_controller
  def destroy
    @post.destroy
    respond_to do |format|
      format.html { redirect_to posts_url, notice: "Post was successfully destroyed." }
      format.json { head :no_content }
      format.turbo_stream {}
    end
  end
# destroy.turbo_stream.rb
<%= turbo_stream.remove(dom_id(@post)) %>

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.

Ayrıca şöyle küçük bir proje de var Blog Demo using Rails 7 + Hotwire Rails + TailwindCss + Stimulus + @rails/request.js - DEV Community Bunu denemedim henüz ancak Scaffold’un ruhuna ters zaten. Bir şeyler eksik gibi. Hızlıca olamadı scaffold bu sefer.

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 :slight_smile:

Kısa zamanda örnekleri ileteceğim. Sevgiler.

1 Like

@eayurt tekrar merhaba,

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? '} } %>

Çıktısı şöyle;

<form data-turbo-confirm="Are you sure?" data-turbo-disable-with="loading..." class="button_to" method="post" action="/books/8">
  <input type="hidden" name="_method" value="delete" autocomplete="off">
  <button type="submit">Destroy this book</button>
  <input type="hidden" name="authenticity_token" value="xyz" autocomplete="off">
</form>

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 :slight_smile:

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 :slight_smile:) 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.

Sevgilerimle.

Kaynaklar için bkz:

Süpersin. Konuyu anladım. Çok teşekkürler. Acaba bunun için şuraya bi PR göndersem mi? Çünkü default gelen scaffold’daki delete düzgün çalışmıyor.

2 Likes

Sanırım burası için bir tweet https://twitter.com/excid3/status/1471241559085617154 :slight_smile:

1 Like

:innocent: Evet tam da aynı konu. Bence bir sonraki versiyonlarda daha da kolaylaştırmak icin iyileştirmeler gelecektir.

1 Like