【问题标题】:undefined method `session_path'未定义的方法“session_path”
【发布时间】:2014-06-26 01:04:39
【问题描述】:

我正在使用 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_authenticable 添加到 user.rb,一切都会开始工作,但我希望我的用户只能通过 Google OAuth2 登录,所以我不想要 :database_authenticable。 session_path 似乎由于某种原因不可用,但我不确定为什么以及如何使其可用。

谢谢, 仁

【问题讨论】:

  • 我有同样的问题,但我没有使用 OmniAuth 或 Google OAuth2。你最后解决了吗?

标签: ruby-on-rails ruby devise omniauth


【解决方案1】:

您需要重新启动 rails 服务器。这就是我的解决方案。

【讨论】:

  • 是的。我添加了一个 registrations_controller.rb 文件并忘记重新启动。教训:文件结构就像开发模式下的初始化程序。
  • 有用的答案。节省的时间比 Geico 节省的保险时间多。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2012-09-17
    • 2013-06-11
    • 2010-12-30
    • 2019-12-25
    • 2021-07-25
    相关资源
    最近更新 更多