参考サイト
https://qiita.com/kenzoukenzou104809/items/7995cd8796c6181b6c95
https://qiita.com/kami_zh/items/94aec2d94a2b4e9a1d0b#devise%E3%81%AE%E5%90%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%94%9F%E6%88%90
https://qiita.com/bino98/items/596b5cffeca7c104bd90
これ基本使って、あとは、新規登録時のuidをデフォルトで入力するやつをやる。
あと、devise側でnameのStrong Parameterの設定と、adminを追加する。
https://kenzooooo.com/programming/rails-omniauth-google-twitter
ツイートのボタンを表示
https://whatsupguys.net/programming-school-dive-into-code-learning-71/
基本このやり方。
あとは、カラムを追加する感じ。
class AddColumnsToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :uid, :string, null:false, default:""
add_column :users, :provider, :string, null:false, default:""
add_column :users, :name, :string, null:false, default:""
add_column :users, :image_url, :string, null:false, default:""
add_index :users, [:uid, :provider], unique: true
add_column :users, :token, :string
add_column :users, :meta, :string
end
end
user.rb
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :trackable, :omniauthable, omniauth_providers: %i(google twitter)
def self.create_unique_string
SecureRandom.uuid
end
protected
def self.find_for_oauth(auth)
user = User.where(uid: auth.uid, provider: auth.provider).first
unless user
user = User.create(name: auth.info.name,
email: User.dumy_email(auth),
provider: auth.provider,
uid: auth.uid,
password: Devise.friendly_token[0, 20],
image_url: auth.info.image,
token: auth.credentials.token,
meta: auth.to_yaml
)
end
user
end
private
def self.dumy_email(auth)
"#{auth.uid}-#{auth.provider}@example.com" #POINT
end
end
app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def twitter
callback_from :twitter
end
def google
callback_from :google
end
def callback_from(provider)
provider = provider.to_s
@user = User.find_for_oauth(request.env['omniauth.auth'])
if @user.persisted?
flash[:notice] = I18n.t 'devise.omniauth_callbacks.success', kind: provider.capitalize
sign_in_and_redirect @user, event: :authentication
session[:user_id] = @user.id #add
else
session['devise.#{provider}_data'] = request.env['omniauth.auth']
redirect_to new_user_registration_url
end
end
end
通常の新規登録も併用して実装する時の注意点
users/registration_controllerを作成して、deviseのコントローラーを継承する
$ rails g controller users::registrations
uidにランダムなuidを代入しています。 また、superメソッドを使用して、もとのメソッドに記述されていたものを、そのまま代入しています。
app/controllers/users/registrations_controller
class Users::RegistrationsController < Devise::RegistrationsController
def build_resource(hash={})
hash[:uid] = User.create_unique_string
super
end
end
app/models/user.rb
def self.create_unique_string
SecureRandom.uuid
end
config/routes.rb(新規登録する際、継承したregistration_controllerにアクションが起動するようにする)
Rails.application.routes.draw do
root to: "blogs#index"
resources :blogs
devise_for :users, controllers: {
omniauth_callbacks: 'users/omniauth_callbacks',
registrations: "users/registrations"
}
end
application_controller(StrongParameterの設定)
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
devise_parameter_sanitizer.permit(:account_update, keys: [:name])
end
end