Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Twitter登録する為に進めていて、躓いた事まとめ

More than 1 year has passed since last update.

まずドキュメントを見ながら進める事が大前提

OmniAuth: Overview
ユーザーが自分のメールアドレス以外の何かでログインすることを許可するやり方

uidをDBに保存する為にストロングパラメーターを通さなければならないが、どこに書くのか問題

下の様にuidを入れるとエラーが出た。

app/controllers/application_controller.rb
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :uid])
      devise_parameter_sanitizer.permit(:account_update, keys: [:name])

NameError
undefined local variable or method `uid' for #<Users::OmniauthCallbacksController:0x0000000467c510
Extracted source (around line #13):

そこで下の様にuidを入れるとエラー解決

app/controllers/users/omniauth_callbacks_controller.rb
  def sign_up_params
    params.require(:user).permit(:uid, :provider, :nickname, :image_url)
  end

ActionDispatch::Cookies::CookieOverflowというエラー

要は、deviseを使っている事情でemailカラムにデータを入れずに登録する事はできない。それが原因で出たエラー。

app/models/user.rb
def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
    user.name = auth.info.name   # assuming the user model has a name
    user.image = auth.info.image # assuming the user model has an image
    # If you are using confirmable and the provider(s) you use validate emails, 
    # uncomment the line below to skip the confirmation emails.
    # user.skip_confirmation!
  end
end

上のuser.email = auth.info.emailの部分に問題がある。twitter情報からメールアドレスは抜けないから、空になる。
そこで、解決策としてダミーのメールアドレスを作って、カラムに入れるようにする。下記の通り。

app/model/user.rb
def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = User.dummy_email(auth)
      user.password = Devise.friendly_token[4, 30]
      user.uid = auth['uid']
      user.provider = auth['provider']
      user.nickname = auth['info']['name']   # assuming the user model has a name
      user.image_url = auth['info']['image'] # assuming the user model has an image
      # If you are using confirmable and the provider(s) you use validate emails, 
      # uncomment the line below to skip the confirmation emails.
      # user.skip_confirmation!
    end
  end

  private
  #twitterでサインアップする時に、本来サインアップに必要なメールアドレスカラムをダミーで埋める
  def self.dummy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com"
  end

これでエラー解決して、twitter認証登録完了。

ドキュメント通りにログアウト作ってエラー

ドキュメント通りに下記を追加する。

config/routes.rb
devise_scope :user do
  delete 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
end

エラー内容は

同じ内容のエラーに関する質問1
同じ内容のエラーに関する質問2

下記のようにしてもエラー

config/routes.rb
root                                    'static_pages#index'
  get '/users/sign_up',               to: 'users/registrations#new'
  get '/users/show',                  to: 'users#show'
  get '/users/auth/twitter/callback', to: 'omniauth_callbacks#twitter'
  DELETE '/users/sign_out',           to: 'devise/sessions#destroy'

エラー内容は
[dry-types] Int type was renamed to Integer
[dry-types] Form types were renamed to Params
rails aborted!
NoMethodError: undefined method `DELETE' for #<ActionDispatch::Routing::Mapper:0x00000003d3d918

deleteをgetに設定変更するを参考に

config/initializers/devise.rb
config.sign_out_via = :get

のようにdeleteからgetに変更する。そして

config/routes.rb
root                                    'static_pages#index'
  get '/users/sign_up',               to: 'users/registrations#new'
  get '/users/show',                  to: 'users#show'
  get '/users/auth/twitter/callback', to: 'omniauth_callbacks#twitter'
  get '/users/sign_out',              to: 'devise/sessions#destroy'

と書いて解決。

k-kou5
メモ程度の事を投稿します(ごみを増やさない為にも最近は限定共有記事が主)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away