Search code examples
ruby-on-railsdevise

Devise destroy_user_session_path doesn't work


In my ruby on rails application I've a problem for the user logout with devise

I've this navbar:

<% if current_user %>
<nav class="top-bar" data-topbar role="navigation">
  <ul class="title-area">
    <li class="name">
      <h1><%= link_to 'Prova CMS', articles_path %></h1>
    </li>
    <li class="toggle-topbar menu-icon"><a href="#"></a></li>
  </ul>

  <section class="top-bar-section">
    <ul class="right">
      <li><%=link_to 'Gestisci Articoli', articles_path %></li>
      <li><%=link_to 'Gestisci Categorie', categories_path %></li>
      <li class="has-dropdown">
        <a href="#"><%= current_user.email %></a>
        <ul class="dropdown">
          <li><%= link_to "Logout", destroy_user_session_path, :method => :delete %></li>
        </ul>
      </li>
    </ul>

    <% if current_page?(articles_path) %>
    <ul class="left">
      <div class="large-12 columns">
        <%= form_tag articles_path, :id => "articles_search" , method: 'get' do %>
          <%= text_field_tag :search, params[:search], :placeholder => "Cerca per titolo"%>
        <% end %>
      </div>
    </ul>
    <% end %>
  </section>
</nav>

<% else %> 

<nav class="top-bar" data-topbar role="navigation">
  <ul class="title-area">
    <li class="name">
      <h1><%= link_to 'Prova CMS', root_path %></h1>
    </li>
    <li class="toggle-topbar menu-icon"><a href="#"></a></li>
  </ul>

  <section class="top-bar-section">
    <ul class="right">
      <li><%= link_to 'Login', new_user_session_path%></li>
    </ul>
  </section>
</nav>

that i render in the application layout of the site (application.html.erb). In some page the logouts links doesn't works and they generate a Hashtag on the url of the views (for example if i'm on the articles_path localhost:3000/articles the link add # near the /articles -> /articles#)

in the config/initializer of devise this string is uncommented:

  # The default HTTP method used to sign out a resource. Default is :delete.
  config.sign_out_via = :delete

and in the application.js i've got all the jquery links working fine:

    // This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require foundation
//= require turbolinks
//= require_tree .

$(function(){ 
    $(document).foundation();
});

and for final these are my routes:

Rails.application.routes.draw do
  get 'show/index'
  root to: "show#index"


  devise_for :users
  resources :categories
  resources :articles

end

Solution

  • I think your issue may be related to turbolinks. Try disabling turbolinks for this page to validate whether this is the case. To your body tag add:

    <body data-no-turbolink="true">
    

    I believe that turbolinks is treating your logout link like a standard page link, preventing the actual functionality firing

    EDIT

    If you prove this is the case, focus disabling turbolinks to just the specific link that causes problems and remove the attribute from the body.

    <%= link_to "Logout", destroy_user_session_path, :method => :delete, :data => { :no_turbolink => true } %>