質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

795閲覧

twitter認証機能をつけたい

KawdaSyouhei

総合スコア15

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/07/21 17:05

環境
rails5.1.6

エラー内容

NoMethodError in SessionsController#create undefined method `[]' for nil:NilClass Extracted source (around line #3): class User < ApplicationRecord def self.find_or_create_from_auth(auth) provider = auth[:provider] uid = auth[:uid] user_name = auth[:info][:user_name] image_url = auth[:info][:image] Rails.root: /home/kawadauwa17/rails/streetlive Application Trace | Framework Trace | Full Trace app/models/user.rb:3:in `find_or_create_from_auth' app/controllers/sessions_controller.rb:3:in `create' Request Parameters: {"provider"=>":provider"} Toggle session dump Toggle env dump Response Headers: None

deviseを使わず認証機能をつけたいです。
gem 'omniauth'
gem 'omniauth-twitter'
を使ってます。

Gemfile

1source 'https://rubygems.org' 2 3gem 'rails', '5.1.6' 4gem 'puma', '3.9.1' 5gem 'sass-rails', '5.0.6' 6gem 'uglifier', '3.2.0' 7gem 'coffee-rails', '4.2.2' 8gem 'jquery-rails', '4.3.1' 9gem 'turbolinks', '5.0.1' 10gem 'jbuilder', '2.7.0' 11gem 'bootstrap', '~> 4.3.1' 12 13gem 'omniauth' 14gem 'omniauth-twitter' 15 16group :development, :test do 17 gem 'sqlite3', '1.3.13' 18 gem 'byebug', '9.0.6', platform: :mri 19 gem 'dotenv-rails' 20end 21 22group :development do 23 gem 'web-console', '3.5.1' 24 gem 'listen', '3.1.5' 25 gem 'spring', '2.0.2' 26 gem 'spring-watcher-listen', '2.0.1' 27end 28 29group :production do 30 gem 'pg', '0.20.0' 31end 32 33# Windows環境ではtzinfo-dataというgemを含める必要があります 34gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

ルートはこんな感じです

routes

1Rails.application.routes.draw do 2 root 'posts#index' 3 4 get 'posts/show' 5 6 get 'posts/new' 7 8 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 9 get '/auth/:provider/callback', to: 'sessions#create' 10 get '/logout', to: 'sessions#destroy' 11 12 13end 14

コントローラーはこんな感じです。

indexhtmlerb

1 <a href="/auth/:provider/callback" class="btn btn-primary">twitterログイン</a>

sessioncontroller

1class SessionsController < ApplicationController 2 def create 3 @user = User.find_or_create_from_auth(request.env['omniauth.auth']) 4 session[:user_id] = @user.id 5 flash[:notice] = "ユーザー認証が完了しました。" 6 redirect_to root_path 7 end 8 9 def destroy 10 reset_session 11 flash[:notice] = "ログアウトしました。" 12 redirect_to root_path 13 end 14end 15

application

1class ApplicationController < ActionController::Base 2 protect_from_forgery with: :exception 3 4 helper_method :current_user, :logged_in? 5 6 private 7 8 def current_user 9 return unless session[:user_id] 10 @current_user ||= User.find(session[:user_id]) 11 end 12 13 def logged_in? 14 !!session[:user_id] 15 end 16 17 def authenticate 18 return if logged_in? 19 redirect_to root_path, alert: "ログインしてください" 20 end 21end 22

モデルはこんな感じにです。

user

1class User < ApplicationRecord 2 def self.find_or_create_from_auth(auth) 3 provider = auth[:provider] 4 uid = auth[:uid] 5 user_name = auth[:info][:user_name] 6 image_url = auth[:info][:image] 7 8 self.find_or_create_by(provider: provider, uid: uid) do |user| 9 user.user_name = user_name 10 user.image_url = image_url 11 end 12 end 13end

omniauth

1Rails.application.config.middleware.use OmniAuth::Builder do 2 # provider :twitter, ENV['APP_ID'], ENV['APP_SECRET'] 3 provider :twitter, 4 Rails.application.secrets.twitter_app[:consumer_key], 5 Rails.application.secrets.twitter_app[:consumer_secret] 6 end

seacret.ymlにキーをおいてます。

twitter_app: &twitter_app consumer_key: 43lJXf0PHv6MZkNjNs2aXLoCi consumer_secret: H2ev2hwLkSahtdvD4hbBdtSOZJzd72455PIiGzfiBGVGgzTlE3 development: secret_key_base: 01f0aa86d8ec57ba6701b150554370fd44301f2bb740c1985d9e36a46e16548d839ed8d9b8e28bf785299778575b037529db06a689c85f640c1e459229c738c4 twitter_app: <<: *twitter_app test: secret_key_base: 3a4ebc0a25821f9ae58923e275cb2633fde5eb4eed4e8d0f14647d193ed2a7088c0f5852e9c2e1a823869827d32e5f34da963e0e22405ee534d2accb97670fcd twitter_app: <<: *twitter_app production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> twitter_app: consumer_key: <%= ENV["TWITTER_CONSUMER_KEY"] %> consumer_secret: <%= ENV["TWITTER_CONSUMER_SECRET"] %>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2019/07/22 01:45 編集

質問のコードに 「キー」と「シークレット」が記載されているようですが、 これは、実際の値でしょうか? 実際の値の場合、第三者に不正利用される可能性がありますので、すぐに Twitter で、公開したキーとシークレットを削除して、新しく作り直してください。 ( 質問される場合は、キーとシークレットは、別の文字に置き換えて記載して、実際の値は公開しないようにしてください。 )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問