带有设计的 Rails 3:没有路线匹配 /d/users/sign_out

Posted

技术标签:

【中文标题】带有设计的 Rails 3:没有路线匹配 /d/users/sign_out【英文标题】:Rails 3 with Devise: No route matches /d/users/sign_out 【发布时间】:2012-07-13 13:27:46 【问题描述】:

当我尝试退出设计时出现以下错误:

没有路由匹配 [GET] "/d/users/sign_out"

我的标签是正确的,如下:

<%= link_to "Sign Out", destroy_session_path, :method=>:delete %>

我的设计路线是:

devise_for :users, :path_prefix=>"d", :controllers=>:sessions=>"sessions"

其他路线有:

resources :users#For CRUD defined after devise_for like in Devise Wiki

使用自定义控制器会话进行 ajax 登录,如 Devise wiki 页面:

class SessionsController < Devise::SessionsController

 def create
  respond_to do |format|
    format.html super 
    format.json do
     resource = warden.authenticate!(:scope => resource_name, :recall => "#controller_path#failure")
     #resource = warden.authenticate!(:scope => resource_name, :recall => :failure)
     return sign_in_and_redirect(resource_name, resource)
    end
   end
  end

def sign_in_and_redirect(resource_or_scope, resource=nil)
  scope = Devise::Mapping.find_scope!(resource_or_scope)
  resource ||= resource_or_scope
  sign_in(scope, resource) unless warden.user(scope) == resource
  return render :json => :success => true, :redirect => stored_location_for(scope) || after_sign_in_path_for(resource)
end

def failure
  return render:json => :success => false, :errors => ["Login failed."]
end

end

设计初始化器有:

config.sign_out_via = :delete

关于什么可能导致问题的任何想法?我已经在 Google 上搜索过,但仍然很困惑。

更新:

这里是供设计用户使用的 rails routes 文件的屏幕截图。对不起,它很小,但您可以右键单击然后单独查看更大的屏幕。

更新 #2:

jquery_ujs 文件已包含在内。

更新#3:

在控制台中显示确实正在传递删除,但它正在从 session_controller 跳转到 / 然后跳转到 d/users/sign_out...不知道如何解决这个问题。

更新 #4:

当重定向它时,它应该首先作为 DELETE 进入 d/users/sign_out。然后它重定向到root_url,然后给出错误ERROR Errno::ECONNABORTED: An established connection was aborted by the software in your host machine.,然后尝试重定向到 d/users/sign_out 作为失败的 GET。

【问题讨论】:

【参考方案1】:

这似乎是 Devise 和 Ruby 1.9.2-p290 之间的问题。更新到 Ruby 1.9.3 并运行 bundle update 以确保使用最新版本的 Devise;似乎有效。

【讨论】:

【参考方案2】:

听起来您可能已经从 application.js 文件中删除了//= require jquery_ujs。我认为这会处理链接详细信息以发出“删除”请求。无论哪种方式,就像现在一样,您正在制作一个显然不会命中您的 destroy_user_session 方法的“GET”。

【讨论】:

对不起,忘了说。那也在那里。我查过了。【参考方案3】:

变化:

config.sign_out_via = :delete

到:

config.sign_out_via = :get

看到这个相关的:

No route matches "/users/sign_out" devise rails 3

【讨论】:

以上是关于带有设计的 Rails 3:没有路线匹配 /d/users/sign_out的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3.2.13 - 没有路线匹配 [GET] "/js/jquery.fancybox.js"

rails 6中没有针对多个路线参数的路线匹配

Rails 中没有路线匹配重复错误。如何调试?

没有路线匹配 [GET] /assets

没有路线匹配 [GET] "/users/sign_out" rails 5

没有路线匹配 [GET] "/users/sign_out" **Rails 5/Bootstrap 4**