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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

サービス

サービスとはバックグラウンド上に常駐し、長時間稼動し続ける実行可能ファイルを指します。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

621閲覧

サービスオブジェクトでログインに必要なパスワードを渡したい。

yohei779904

総合スコア6

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

サービス

サービスとはバックグラウンド上に常駐し、長時間稼動し続ける実行可能ファイルを指します。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2020/05/23 11:13

Ruby on Railsでサービスオブジェクトを利用してログインができるようにしたいと考えています。Ruby on Railsを勉強して、現在9か月前後というのもあり、サービスオブジェクトを勉強したいということもあります。

ログインするためは、emailとpasswordが必要となるようにしています。emailはフォームオブジェクトを使用しています。(現在のところ、何も問題なし。)passwordはサービスオブジェクトを使用する予定です。ただし、サービスオブジェクトのコードを入力すると、下記画像のように、【BCrypt::Errors::InvalidHash in ・・・】のエラーが出てしまいます。大変申し訳ございませんが、解決策など教えていただけないでしょうか。

【環境】

Rails 5.1.7 gem 'bcrypt', '~> 3.1.7'

イメージ説明

【migrate/create_support_members.rb】 class CreateSupportMembers < ActiveRecord::Migration[5.1] def change create_table :support_members do |t| t.string :lastname t.string :firstname t.string :lastname_kana t.string :firstname_kana t.string :email t.string :hashed_password t.boolean :suspended, default: false, null: false t.timestamps end end end
【model/support_members.rb】 before_save { self.email.downcase! } validates :lastname, presence: true, uniqueness: true validates :firstname, presence: true, uniqueness: true validates :lastname_kana, presence: true, uniqueness: true validates :firstname_kana, presence: true, uniqueness: true validates :email, presence: true,uniqueness: { case_sensitive: false }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i } validates :hashed_password, presence: true, length: { minimum: 6, maximum: 16 } # 下記でパスワードをハッシュ化する。 def password=(raw_password) if raw_password.kind_of?(String) self.hashed_password = BCrypt::Password.create(raw_password) elsif raw_password.nil? self.hashed_password = nil end end
【supporter/sessions_controller.rb】 def new if current_support_member redirect_to supporter_support_member_path(current_support_member) else @form = Supporter::LoginForm.new render :new end end def create # 下記はフォームオブジェクトを使用。 @form = Supporter::LoginForm.new(login_form_params) if @form.email.present? support_member = SupportMember.find_by('LOWER(email)= ?', @form.email.downcase) end   # 下記はサービスオブジェクトを使用。 if Supporter::Authenticator.new(support_member).authenticate(@form.password) session[:support_member_id] = support_member.id flash.notice = 'ログインしました。' redirect_to supporter_support_member_path(current_support_member) else flash.now.alert = 'メールアドレスまたはパスワードが正しくありません。' render :new end end 以下省略・・・
【services/supporter/authenticater.rb】 class Supporter::Authenticator def initialize(support_member) @support_member = support_member end def authenticate(raw_password) @support_member && @support_member.hashed_password && BCrypt::Password.new(@support_member.hashed_password) == raw_password end end

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

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

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

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

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

guest

回答1

0

自己解決

railsのバージョンをrails6に変更したところ問題なくできました。

投稿2020/06/10 02:09

yohei779904

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問