Try T.M Engineer Blog

「アウトプットする事は大事だ」と思って初めたブログ、プログラミング、独り語り、etc

BCryptLibを使ってユーザー登録画面の実装

Railsについて、勉強を初めてみました。
いやぁ、勉強してみて実感しますが、本やブログ記事等の解説は簡単に書かいているのに、実際使ってみると「あれ?どうやるんだっけ?どういう仕組で動いているんだっけ?」と疑 問に思う事ばかりです。ちゃんと理解できているのか・・・不安でしょうがないです。
さて、まだまだ勉強中なのですが、Railsを使って学んだ事をブログ記事に残して置こうと思ったので、「学びシリーズ」(新コンテンツ?)というカテゴリーを設けて書いていきたいと思います。内容は主に、自分で小さな機能を作って、その振り返り記事がメインになると思います。豆知識や小技等、いわゆるTIPS的な事はQiitaに書いていきたいと思います。

作ってみた機能

BCryptライブラリを使ってユーザー登録画面を実装

環境構成

全体構成・完成イメージ

f:id:special-moucom:20180425015618p:plain

[DB]TABLE

 "managers" ("manager_name" varchar NOT NULL, "hashed_password" varchar NOT NULL)

プログラムコード等

Controller


class ManagersController < ApplicationController
  def new
    @manager = Manager.new
  end

  def create
     @crt_manager = Manager.new(params[:manager].permit(:manager_name, :password, :password_confirmation))
     # DBにデータ保存
     if @crt_manager.save
       render "show"
       p "登録が完了しました。"
     else
       render "new"
     end
   end

   def show
   end
end

newメソッドでは、Managerのインスタンス変数:@managerを生成しています。
createメソッドでは、newメソッドで宣言したインスタンス変数:@managerから画面で入力した名前とパスワード2つを取得しています。permitメソッドを呼ぶことでModelに余計な属性を保存させないようにする事が可能です。DBに入れる値を制限し、余計な属性をDBに保存させない事をストロング・パラメータと言います。その後は、名前と暗号化したパスワードをDB(SQLite)に保存して、show画面に遷移しています。

Model


class Manager < ActiveRecord::Base
  attr_accessor :password, :password_confirmation

  def password=(val)
   if val.present?
       self.hashed_password = BCrypt::Password.create(val)
   end
     @password = val
   end
end

ここではControllerのcreateメソッドで取得したパスワード(password)をBCryptライブラリを使って暗号化しています。
present?メソッドは「unless 変数.blank?」と同じ意味を持ち、変数が空かそもそも変数自体が存在しないかを聞いています。今回は、変数が空か変数自体が存在しない場合はスキップしています。なお、上記プログラムではpassword_confirmationの変数は参照しておらず、passwordのみ参照しています。

ERB


<p>ユーザー登録ページ</p>
<%= form_for @manager do |form| %>
  <table>
    <tr>
      <td style="text-align: right">ユーザー名</td>
      <td><%= form.text_field :manager_name, style: "width: 120px" %></td>
    </tr>
    <tr>
      <td style="text-align: right">パスワード</td>
       <td><%= form.password_field :password, style: "width: 120px" %></td>
     </tr>
     <tr>
       <td style="text-align: right">再パスワード</td>
       <td><%= form.password_field :password_confirmation, style: "width: 120px" %></td>
     </tr>
     <tr>
       <td colspan="2" style="text-align: center">
       <%= form.submit "登録" %></td>
     </tr>
   </table>
<% end %>

こちらはControllerのnewメソッドを通して表示されるERB画面です。newメソッドで作られた@managerとfrom_forタグを使ってフォームを生成しています。なお、show画面の説明は割愛します。

学んだ事

Webアプリケーションの基本である画面に入力した値をDBに保存するという流れを理解できた事。また、Rails 4.0から導入されたセキュリティ強化策の1つであるストロング・パラメータというのがある事を知りました。これだけの少ないコードで、これだけの機能を実装できるRailsってやっぱり凄いなと改めて実感しました。
ブログに書くこと。図にする事で、自分の理解も深まった気がするので、このコンテンツは引き続き続けていきたいと思います。