Getting sign out link_tos to work with Rails 7

How to get your sign out link_tos to work with Rails 7

With the release of Rails 7 we have seen yet another shift with how the frontend is handled. Rails 7 has moved away from Webpacker (thank goodness!) to using Turbo. When creating a new app I stumbled upon a new way of handling link_tos which I hadn’t seen before.

When I created my User using Devise I wanted to add a Sign Out button to my app, Devise was one of the first things I had set up in my app so I was running with a pretty vanilla app. When I clicked the Sign Out button I had created I got this error message: no route matches [get] "/users/sign_out", double checking my routes I could see in routes.rb I had devise_for :users and when running rails routes I had everything set up correctly routing wise.

The next thing I wanted to investigate was my link_to. When setting up older Rails projects and sign out links I had included rails_ujs and set my link_to like this: <%= link_to 'Sign Out', destroy_user_session_path, class: 'some-css-class', data: { method: :delete } %>. With Rails 7 using Turbo you can now set up Sign Out link_tos like this:

<%= link_to 'Sign Out', destroy_user_session_path, class: 'some-css-class', data: { turbo_method: :delete } %>

Note that method has now changed to turbo_method and you don’t need to set up any additional rails_ujs or jQuery to get link_tos to work like you would’ve in older versions of Rails.

If you want to add a confirm dialog to your delete you’ll have to pass turbo_confirm instead of confirm, like this:

<%= link_to 'Delete', article_path(article), data: { turbo_method: :delete, turbo_confirm: 'Are you sure?' } %>

Recent posts View all

Web Dev

Creating draft posts in Jekyll

How to create and develop with draft posts in Jekyll

Ruby

Forcing a Rails database column to be not null

How you can force a table column to always have something in it with Rails