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

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

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

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

受付中

RailsでGemなしのログイン機能を実施の際のauthenticateエラー

maplemaple
maplemaple

総合スコア0

Ruby on Rails

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

1回答

1評価

1クリップ

1134閲覧

投稿2019/04/06 13:06

前提・実現したいこと

RailsでGemなしのログイン機能を実施しようとしていますが、画面で
undefined method `authenticate' for nil:NilClass
のエラー が発生しています。
bcryptもインストールし、Userコントローラーにhas_secure_passwordを記載していますが
SessionsControllerでエラー になってしまいます。
解決策が見つからずつまっています。
わかる方いらっしゃいましたらよろしくお願いします。

発生している問題・エラーメッセージ

NoMethodError in SessionsController#create
undefined method `authenticate' for nil:NilClass

該当のソースコード

SessionsController.rb

class SessionsController < ApplicationController skip_before_action :require_sign_in!, only: [:new, :create] before_action :set_user, only: [:create] def new redirect_to tasks_path if signed_in? end def creates if @user.authenticate(session_params[:password]) sign_in(@user) redirect_to tasks_path else redirect_to login_path, :alert => "無効なユーザー名/パスワードです。" flash.now[:danger] = t('.flash.invalid_password') render 'new' end end def destroy sign_out redirect_to login_path end private def set_user @user = User.find_by(user_id: session_params[:user_id]) rescue flash.now[:danger] = t('.flash.invalid_userid') render action: 'new' end def session_params params.require(:session).permit(:user_id, :password) end end

User.rb

class User < ApplicationRecord has_secure_password validates :user_id, presence: true, uniqueness: true validates :password, presence: true def self.new_remember_token SecureRandom.urlsafe_base64 end def self.encrypt(token) Digest::SHA256.hexdigest(token.to_s) end has_many :tasks, dependent: :destroy end
class ApplicationController < ActionController::Base before_action :current_user before_action :require_sign_in! helper_method :signed_in? protect_from_forgery with: :exception def current_user remember_token = User.encrypt(cookies[:user_remember_token]) @current_user ||= User.find_by(remember_token: remember_token) end def sign_in(user) remember_token = User.new_remember_token cookies.permanent[:user_remember_token] = remember_token user.update_attribute(:remember_token, User.encrypt(remember_token)) @current_user = user end def sign_out @current_user = nil cookies.delete(:user_remember_token) end def signed_in? @current_user.present? end private def require_sign_in! redirect_to login_path unless signed_in? end end

Gemfile

ruby '2.6.2' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.2.2', '>= 5.2.2.1' # Use mysql as the database for Active Record gem 'mysql2', '>= 0.4.4', '< 0.6.0' # Use Puma as the app server gem 'puma', '~> 3.11' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' gem 'rails-i18n', '~> 5.1' gem 'kaminari', '~> 0.17.0' # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use ActiveModel has_secure_password gem 'bcrypt', '~> 3.1.11' # Use ActiveStorage variant # gem 'mini_magick', '~> 4.8' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', '>= 1.1.0', require: false

補足情報(FW/ツールのバージョンなど)

OS mac
Rails 5.2.2.1
ruby 2.6.2

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

urbainleverrier
urbainleverrier

2019/04/06 15:39

`User\.find_by\(user_id: session_params\[:user_id\]\)`でuserが見つからないのではないですか\?
maplemaple
maplemaple

2019/04/07 03:38

おっしゃる通り、userが見つからないためにエラーとなっておりました。 データがあるuser情報を入力するとエラーはでませんでした。 ご回答ありがとうございます。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails

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