Rails - 在Devise中销毁会话路径时出现路由错误

23 浏览
0 Comments

Rails - 在Devise中销毁会话路径时出现路由错误

我创建了一个简单的Rails应用,并在其中实现了Devise,我添加了登录/注册功能,它正常工作。但是当我添加"退出登录"功能时,它给我一个"Routing Error",错误信息是"No route matches [GET] '/ideas/sign_out'"。

这是我实现的代码:

<% unless idea_signed_in? %>
    
  • 探索
  • <%= link_to "登录", new_idea_session_path %>
  • <%= link_to "分享创意", new_idea_registration_path %>
  • <% else %>
  • 仪表盘
  • 探索
  • <%= link_to "退出登录", destroy_idea_session_path, method: :delete %>
  • <% end %>

    我甚至尝试了:method => :delete,但仍然没有效果。我运行了rake routes,我的路由是有效的:

    destroy_idea_session_path DELETE /ideas/sign_out(.:format) devise/sessions#destroy

    我在application.html.erb中添加了<%= javascript_include_tag :defaults %>,但仍然没有运气。

    我的routes.rb文件:

    Rails.application.routes.draw do
      devise_for :ideas
      root 'welcome#index'
    end
    

    0
    0 Comments

    问题出现的原因是控制器发送了一个GET请求而不是一个DELETE请求。如果没有启用JavaScript,请求将回退到GET方法。

    解决方法是尝试将devise_for :ideas更改为devise_for :ideas, sign_out_via [:delete]。确保在测试设备上启用了JavaScript。如果所有其他方法都失败了,可以去Devise配置文件中修改config.sign_out_via = :deleteconfig.sign_out_via = :get,并在路由文件中删除, sign_out_via [:delete]

    0
    0 Comments

    Rails - 在Devise中销毁会话路径时遇到路由错误

    问题的出现原因是忘记在link_to引用中加入method: :delete开关。为了确保这不是问题,可以使用以下代码:

    <%= link_to "Logout", destroy_idea_session_path, method: :delete %>
    

    如果你的链接是这样实现的,似乎是这样的,下一个潜在的问题是你的视图中没有加载jquery。delete动词实际上不被大多数浏览器支持,因此Rails使用jquery来修改HTML以将delete开关作为链接的data属性的一部分传递。你需要确保在视图和布局中加载JQuery:

    #app/views/layouts/application.html.erb
    <%= javascript_include_tag "application" %>
    #app/assets/javascripts/application.js.erb
    //= require jquery
    //= require jquery_ujs
    //= require turbolinks
    //= require_tree .
    

    这将确保JQuery被加载,并且你的应用程序可以处理DELETE方法。

    0