在使用 OmniAuth 进行 3rd 方登录之前,我的设计工作正常,基本上是自定义字段 name 和 last_name 在尝试定期注册时出错,因为 cannot be blank,但它们的值不是 blank。
这是我在第 3 方授权之前拥有的代码:
#config/routes.rb
devise_for :users, :controllers => {:registrations => "users/registrations"}
# app/models/user.rb
class User < ApplicationRecord
validates :name, presence: true
validates :last_name, presence: true
acts_as_favoritor
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
end
# app/controlers/user/registrations_controller
class User::RegistrationsController < Devise::RegistrationsController
before_action :configure_permitted_parameters, if: :devise_controller?
layout 'user', only: [:edit, :update]
def update_resource(resource, params)
resource.update_with_password(params)
end
protected
def sign_up_params
params.require(:user).permit(:name,:last_name, :email, :password, :password_confirmation)
end
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:account_update, keys: [:name, :last_name, :email, :password, :password_confirmation])
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :last_name, :email, :password, :password_confirmation])
end
end
现在怎么样了:
#config/routes.rb
devise_for :foodies, controllers: {omniauth_callbacks: 'omniauth'}
# app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
validates :name, presence: true
validates :last_name, presence: true
acts_as_favoritor
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable,
:omniauthable, omniauth_providers: [:facebook, :google_oauth2]
def self.create_from_provider_data(provider_data)
where(provider: provider_data.provider, uid: provider_data.uid).first_or_create do |user|
user.name = provider_data.info.first_name
user.last_name = provider_data.info.last_name
user.email = provider_data.info.email
user.password = Devise.friendly_token[0, 20]
end
end
end
# app/controlers/user/registrations_controller
# it didn't change
# app/controlers/user/omniauth_controller
class OmniauthController < Devise::OmniauthCallbacksController
def google_oauth2
@user = User.create_from_provider_data(request.env['omniauth.auth'])
if @user.persisted?
sign_in_and_redirect @user
set_flash_message(:notice, :success, kind: 'Google') if is_navigational_format?
else
flash[:error]='There was a problem signing you in through Google. Please register or try signing in later.'
redirect_to user_registration_url
end
end
def failure
flash[:error] = 'There was a problem signing you in. Please register or try signing in later.'
redirect_to user_registration_url
end
end
PS:如果我将路线返回到原来的,常规注册工作,但第 3 方没有