undefined method 'session_path'

Я использую Rails + Devise + OmniAuth + Google OAuth2.

Моя модель пользователя (user.rb) содержит:

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

Мои маршруты.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 недоступен по какой-то причине, но я не уверен, почему и как сделать его доступным.

Спасибо, Джен

Ответ 1

Вам необходимо перезагрузить сервер rails. Это решение для меня.

Ответ 2

Я действительно верю, что, когда вы используете devise_scope для путей sessions, вам нужно добавить skip к вызову devise_for, например:

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

Это не приведет к созданию помощников маршрута для контроллера sessions

Ответ 3

Попробуйте изменить эту строку

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

в

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