未定义的方法`session_path’

我正在使用Rails + Devise + OmniAuth + Google OAuth2。

我的用户模型(user.rb)包含:

devise :registerable, :omniauthable, :omniauth_providers => [:google_oauth2] 

我的routes.rb看起来像:

 Rails.application.routes.draw do devise_for :users, controllers: { omniauth_callbacks: 'omniauth_callbacks' } devise_scope :user do get 'sign_in', :to => 'devise/sessions#new', :as => :new_user_session post 'sign_in', :to => 'devise/session#create', :as => :user_session get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session end get 'services', to: 'static_pages#services' get 'my_account', to: 'my_account#index' get 'invite', to: 'invite#show' get 'invite/:id', to: 'invite#show' root 'static_pages#home' end 

当我去/ sign_in时,我得到一个例外:

 undefined method `session_path' for #<#:0x007f9b713d8da8> 

在:

 ~/.rvm/gems/ruby-2.1.1/gems/devise-3.2.4/app/views/devise/sessions/new.html.erb 

排队:

  

如果我添加:database_authenticatable到user.rb它开始工作,但我希望我的用户只能通过Google OAuth2登录,所以我不想要:database_authenticable。 看起来session_path由于某种原因不可用,但我不确定为什么以及如何使它可用。

谢谢,Jen

您需要重启rails服务器。 那是我的解决方案。

我确实相信,当您使用devise_scope作为sessions路径时,您需要将skip添加到您的devise_for调用中,如下所示:

 devise_for :users, skip: [:sessions], controllers: { omniauth_callbacks: 'omniauth_callbacks' } 

这样做不会为sessions控制器生成路由助手

尝试更改此行

 post 'sign_in', :to => 'devise/session#create', :as => :user_session 

 post 'sign_in', :to => 'devise/session#create', :as => :session