0

在使用 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 方没有

4

0 回答 0