web-dev-qa-db-ja.com

未定義のメソッド `session_path '

Rails + Devise + OmniAuth + GoogleOAuth2を使用しています。

私のユーザーモデル(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| %>

User.rbに:database_authenticatableを追加すると、すべてが機能し始めますが、ユーザーがGoogle OAuth2からのみサインインできるようにしたいので、:database_authenticableは必要ありません。何らかの理由でsession_pathが利用できないようですが、なぜ、どのように利用できるのかわかりません。

ありがとう、ジェン

22
user3777406

Railsサーバーを再起動する必要があります。それが私にとっての解決策でした。

58
Abel

sessionsパスにdevise_scopeを使用する場合、次のようにskipdevise_for呼び出しに追加する必要があると思います。

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

これを行っても、sessionsコントローラーのルートヘルパーは生成されません。

1
Benj