我正在使用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 #<#<Class:0x007f9b7173af28>:0x007f9b713d8da8>
在:
~/.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它开始工作,但我希望我的用户只能通过Google OAuth2登录,所以我不想要:database_authenticable。看起来session_path由于某种原因不可用,但我不确定为什么以及如何使它可用。
谢谢, 仁
答案 0 :(得分:48)
您需要重启rails服务器。那是我的解决方案。
答案 1 :(得分:0)
我确实相信,当您devise_scope
路径使用sessions
时,您需要在skip
电话中添加devise_for
,如下所示:
devise_for :users, skip: [:sessions], controllers: { omniauth_callbacks: 'omniauth_callbacks' }
这样做不会为sessions
控制器生成路由助手
答案 2 :(得分:-1)
尝试更改此行
post 'sign_in', :to => 'devise/session#create', :as => :user_session
到
post 'sign_in', :to => 'devise/session#create', :as => :session