2014-06-26 23 views
12

我正在使用Rails + Devise + OmniAuth + Google OAuth2。未定義方法`session_path'

我的用戶模型(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 #<#<Class:0x007f9b7173af28>:0x007f9b713d8da8> 

in:

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

在行:

<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> 

如果我添加:database_authenticatable到user.rb這一切開始工作,但我希望我的用戶能夠僅登錄在通過谷歌的OAuth2,所以我不希望:database_authenticable。它看起來像session_path由於某種原因不可用,但我不知道爲什麼以及如何使它可用。

感謝, 仁

+0

我有同樣的問題,但我沒有使用OmniAuth或者Google OAuth2。你最終解決了嗎? – Moh

回答

0

我相信,在您使用devise_scopesessions路徑,你需要添加skipdevise_for通話,就像這樣:

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

這樣做不會生成sessions控制器的路由助手

-1

嘗試更改此行

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

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

您需要重新啓動Rails服務器。這是我的解決方案。

+1

是的。我添加了一個registrations_controller.rb文件並忘記重新啓動。教訓:文件結構就像開發模式中的初始化程序。 – Jerome

+0

有用的答案。比Geico節省更多時間保險。 – HoosierCoder