Rails应用程序在javascript中找不到'destroy_user_session_path'

Cra*_*aig 2 javascript ruby ruby-on-rails devise ruby-on-rails-3.2

我有一个rails应用程序,从2.2到3.2开始多年来一直在迁移.我正在使用Devise和Omniauth来使登录工作,不幸的是我认为在迁移期间我搞砸了一些东西.

当我尝试在application.html.erb中设置会话删除时,我收到以下错误:

undefined local variable or method `destroy_user_session_path' for #<#<Class:0xb468e278>:0xb423e1dc>
Run Code Online (Sandbox Code Playgroud)

application.html.erb:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>Coffee Tracker</title>
  <%= stylesheet_link_tag 'application'%>
  <!--%= stylesheet_link_tag 'scaffold' %-->
</head>
<!--%= javascript_include_tag :defaults %-->
<%= javascript_include_tag 'application' %>
<%= csrf_meta_tag %>
...snip...
<% if user_signed_in? %>
  <span id="currentuser"><%= current_user.email %></span>
  <%= link_to('Logout', destroy_user_session_path, :method => 'delete') %>
<% else %>
Run Code Online (Sandbox Code Playgroud)

我尝试这行时也遇到同样的错误:

 <%= link_to('Logout', destroy_user_session_path, :method => :delete) %>
Run Code Online (Sandbox Code Playgroud)

的application.js

// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults
//= require_self
//= require_tree .
//= require jquery
//= require jquery_ujs
Run Code Online (Sandbox Code Playgroud)

Rails 3.2.0 ruby​​ 1.8.7(2011-02-18 patchlevel 334)[i686-linux]

  • 铁轨(3.2.0)
  • jquery-rails(2.0.0)
  • 设计(2.0.0)
  • omn​​iauth(1.0.2)
  • omn​​iauth-facebook(1.2.0)
  • omn​​iauth-oauth2(1.0.0)

更新: 这是rake路线:

user_omniauth_callback     /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:facebook)
           coffee_list GET /coffee/list(.:format)                 coffee#list
                  root     /                                      menu#index
                           /:controller(/:action(/:id(.:format))) :controller#:action
Run Code Online (Sandbox Code Playgroud)

mon*_*zok 6

如果你想使用omniauthable没有database_authenticatable,你需要手动添加路径.

routes.rb:

devise_scope :user do
  delete "/users/sign_out" => "devise/sessions#destroy"
end
Run Code Online (Sandbox Code Playgroud)

然后在你看来:

= link_to "Sign out", users_sign_out_path, :method => :delete
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅这些Omniauth Facebook和Twitter教程:

我们为什么要这样做?请参阅Jose Valim的理由: