Ruby on rails Rails NoMethodError未定义的方法“provider';零级:零级
我很快就要让google auth为我的rails应用程序工作了,我已经在初始化器下设置了客户端id和密钥,但我不知道我还缺少什么 我安装了google-auth2 gem并迁移了我的表。当我按“登录”而没有在登录页面上填写任何内容时(它应该告诉我填写电子邮件和密码),我会收到此错误,当我与用户登录时,我也会收到此错误 错误:Ruby on rails Rails NoMethodError未定义的方法“provider';零级:零级,ruby-on-rails,google-authentication,Ruby On Rails,Google Authentication,我很快就要让google auth为我的rails应用程序工作了,我已经在初始化器下设置了客户端id和密钥,但我不知道我还缺少什么 我安装了google-auth2 gem并迁移了我的表。当我按“登录”而没有在登录页面上填写任何内容时(它应该告诉我填写电子邮件和密码),我会收到此错误,当我与用户登录时,我也会收到此错误 错误: NoMethodError in SessionsController#create undefined method `provider' for nil:NilCla
NoMethodError in SessionsController#create
undefined method `provider' for nil:NilClass
Extracted source (around line #9):
7
8
9
10
11
12
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_initialize do |user|
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
会话控制器:
class SessionsController < ApplicationController
def new
@user = User.new
end
def create
unless params[:email].empty?
@user = User.find_by_email(params[:email])
if @user && @user.authenticate(params[:password])
session[:user_id] = @user.id
redirect_to albums_path
else
flash[:alert] = "Email or Password Incorrect. Please try again."
redirect_to signin_path
end
else
flash[:alert] = "Please include your Email & Password."
redirect_to signin_path
end
if
@user = User.from_omniauth(request.env["omniauth.auth"])
session[:user_id] = @user.id
redirect_to root_path
end
end
def destroy
session.clear
redirect_to root_path
end
end
routes.rb
Rails.application.routes.draw do
get 'auth/:provider/callback', to: 'sessions#create'
get 'auth/failure', to: redirect('/')
get '/signup' => 'users#new', as: 'signup'
post '/signup' => 'users#create'
get '/signin' => 'sessions#new'
post '/signin' => 'sessions#create'
get '/signout' => 'sessions#destroy'
post '/logout', to: "sessions#destroy"
resources :albums do
resources :reviews, except: [:index]
end
resources :users, only: [:show, :destroy]
resources :reviews, only: [:index]
root to: "albums#index"
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
添加列迁移:
class AddColumnsToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :provider, :string
add_column :users, :uid, :string
end
end
你能发布日志吗?错误在哪里?抱歉,一开始就添加了这一点是整个错误吗?代码有点乱,出现了一个新错误。你能发布日志吗?错误在哪里?抱歉,一开始就添加了这一点是整个错误吗?代码有点乱,出现了一个新错误
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, "client-id-changed-for-stackoverflow", "secret-key"
end
Rails.application.routes.draw do
get 'auth/:provider/callback', to: 'sessions#create'
get 'auth/failure', to: redirect('/')
get '/signup' => 'users#new', as: 'signup'
post '/signup' => 'users#create'
get '/signin' => 'sessions#new'
post '/signin' => 'sessions#create'
get '/signout' => 'sessions#destroy'
post '/logout', to: "sessions#destroy"
resources :albums do
resources :reviews, except: [:index]
end
resources :users, only: [:show, :destroy]
resources :reviews, only: [:index]
root to: "albums#index"
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
class AddColumnsToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :provider, :string
add_column :users, :uid, :string
end
end
Started POST "/signin" for ::1 at 2020-04-18 20:42:13 -0400
Processing by SessionsController#create as HTML
Parameters: {"authenticity_token"=>"33vGGzcGDDuqWWRzZfAH/mhjdK66w3XJhzGNSn3P4Xd021XRdTU9tw5XQgR", "email"=>"", "password"=>"[FILTERED]", "commit"=>"Sign in"}
Redirected to http://localhost:3000/signin
Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.0ms | Allocations: 1096)
NoMethodError (undefined method `provider' for nil:NilClass):
app/models/user.rb:9:in `from_omniauth'
app/controllers/sessions_controller.rb:20:in `create'