【问题标题】:Rails devise sign_out is giving No route matches [GET]Rails 设计sign_out 给出没有路线匹配[GET]
【发布时间】:2014-06-10 21:13:11
【问题描述】:

这似乎是一个非常常见的问题,我已经遵循了谷歌的许多修复,但我的退出问题仍然存在。

这就是我所拥有的:Rails 4.1.1,Devise 3.2.4。哦,顺便说一句,我正在调用我的模型 AppUser 而不是 User

正在观看

As AppUser: <br>
<% if app_user_signed_in? %>
    Signed in as: <%= current_app_user.email %> <br>
    <%= link_to "Sign Out", destroy_app_user_session_path, method: :delete %>
<% else %>  
    <%= link_to "Sign Up", new_app_user_registration_path %> <br>
    <%= link_to "Sign In", new_app_user_session_path %>
<% end %>

/config/routes.rb

Rails.application.routes.draw do
  devise_for :app_users
  root 'home#index'
end

这些是 rake 路由的部分路由

                  Prefix Verb   URI Pattern                        Controller#Action
    new_app_user_session GET    /app_users/sign_in(.:format)       devise/sessions#new
        app_user_session POST   /app_users/sign_in(.:format)       devise/sessions#create
destroy_app_user_session DELETE /app_users/sign_out(.:format)      devise/sessions#destroy

在 application.js 上

//= require jquery
//= require jquery_ujs
//= require_tree .

在 application.html.erb 上,我也包含了这个

 <%= javascript_include_tag 'application' %>

然而,我仍然收到 get route 错误:

No route matches [GET] "/app_users/sign_out"

为什么????

好的。 因此,将 :delete 更改为 :get on /config/initializer/devise.rb 解决了问题,当然删除了 method: :delete。

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

但我还是不明白?为什么?如果我要在 devise.rb 上保留 :delete,我错过了什么?

==========================

[已解决] 我可能应该在这里编辑状态更新:

我终于知道为什么了。即使我已经正确设置了我的 javascript 等,但它没有加载,因为我愚蠢地从“ActionController::Base”而不是“ApplicationController”继承了我的控制器类。

当我完成我的项目时,我注意到其他页面上的 link_tos 也无法发送 :delete 方法。

一旦我修复了继承,它们都可以工作。

呸。

【问题讨论】:

  • 这很奇怪,我可以重新创建该错误的唯一方法是直接输入方向...您可以发布您的路线文件吗?
  • 你的 config/routes.rb 说什么
  • 我将我的 routes.rb 添加到我的原始帖子中。虽然关于设计的行我相信只是'devise_for:app_users',这给了我一堆通过rake路线的路线,我也部分地包含在原始帖子中
  • 这件事快把我逼疯了。我想念的东西一定很简单。但我不知道它是什么。
  • 这个问题已经被问了很多次了....

标签: ruby-on-rails ruby devise


【解决方案1】:

routes.rb

devise_scope :app_user do
  get "/app_users/sign_out" => "devise/sessions#destroy"
end

【讨论】:

    【解决方案2】:

    JQuery?

    如果我在 devise.rb 上保留 :delete,我错过了什么?

    从外观上看,问题可能与您的系统未正确呈现/处理 :delete HTTP 动词有关。问题将是一个 Javascript 问题,因为这个 http 动词是由 rails UJS 在标准 get 链接上创建的

    我建议您要么系统上的其他 javascript 文件出现问题(检查浏览器控制台),要么您没有正确加载 jquery_ujs 文件

    最好的测试方法是首先查看browser console,然后看看你是否可以在你的 JS 中绑定一个动作到事件:

    #app/assets/javascripts/application.js
    $(document).on("click", "#test_link", function(){
        alert("test");
    });
    

    【讨论】:

      【解决方案3】:

      我终于知道为什么了。 即使我已经正确设置了我的javascript等,但它没有加载,因为我愚蠢地从“ActionController::Base”而不是“ApplicationController”继承了我的控制器类。

      当我完成我的项目时,我注意到其他页面上的 link_tos 也无法发送 :delete 方法。

      一旦我修复了继承,它们都可以工作。

      呸。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-29
        • 2014-07-05
        • 2013-06-15
        • 2017-08-03
        • 2015-12-09
        • 2012-01-30
        相关资源
        最近更新 更多