-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Troubleshooting Rails 7 and Turbo Drive
Since Turbolinks
is replaced with Turbo Drive
(That is part of Hotwire), we need to ensure full-page redirects when submitting devise forms. To do so, add data: { turbo: false }
on all devise forms, after you run rails generate devise:views
.
Example:
app/views/devise/confirmations/new.html.erb
-<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
+<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post, data: { turbo: false } }) do |f| %>
app/views/devise/registrations/new.html.erb
--<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
++<%= form_for(resource, as: resource_name, url: registration_path(resource_name), data: { turbo: false }) do |f| %>
Do this with all the forms under app/views/devise
.
The Log out
link. Since Rails 7 does not use rails-ujs
, you can not use method
on link_to
. So something like this will not work:
<%= link_to "Log out", destroy_user_session_path, method: :delete %>
Instead, here are 3 ways a Log out
link will work:
<%= link_to "Log out", destroy_user_session_path, data: { turbo_method: :delete } %>
<%= link_to "Log out", destroy_user_session_path, 'data-turbo-method': :delete %>
<%= button_to "Log out", destroy_user_session_path, method: :delete, data: { turbo: false } %>
If you still need to use rails-ujs
with Rails 7, the link_to links above will not work unless you add turbo_stream as a navigational format.
Open config/initializers/devise.rb for editing. In the file, locate the Devise.setup block and add the following highlighted line (there might be other blocks of code inside the Devise.setup block, but you can ignore those):
config/initializers/devise.rb
Devise.setup do |config|
# ...
config.navigational_formats = ['*/*', :html, :turbo_stream]
# ...
end
Here's a minimal set up for devise links that you might want to add to your app:
<% if current_user %>
<%= link_to current_user.email, edit_user_registration_path %>
<%= link_to "Log out", destroy_user_session_path, data: { turbo_method: :delete } %>
<% else %>
<%= link_to_unless_current "Log in", new_user_session_path %>
<%= link_to_unless_current "Register", new_user_registration_path %>
<% end %>