Rails 総復習1ヶ月チャレンジ 8日目(Railsチュートリアル編)

はい!8日目です!(昨日の記事が間違って8日目になっておりました・・・)
昨日に引き続きRailsチュートリアルの復習テストの振り返りです!

8日目(Railsチュートリアル 1〜13章復習テスト 後編)

ハッシュ化ってどういうこと?暗号化との違いは?

ハッシュ化・・・ハッシュ関数という特殊な計算方法によってハッシュ値というデータに変換すること。ハッシュ値は復号できない(不可逆変換)。同じデータから得られるハッシュ値は常に同じ。

暗号化・・・データを特定の規則に従って別の文字列に変えること。複合化が前提。共通鍵暗号(AさんがBさんにファイルを渡す前に暗号化→ Bさんに暗号化したファイルと複合化する為の鍵を渡す→Bさんは受け取った鍵でファイルを複合化)

暗号化との違い・・・暗号化は複合化を前提としています。ハッシュ化は復号を前提としていません。そのため、第三者ハッシュ値から元のデータを割り出すことは極めて困難です。さらに、ハッシュ値を受け取った人だけでなく作業をした当人ですら復号はできないため、ハッシュ化は不可逆性を持つ点が大きな特徴。

これ説明できる?

def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

Sessionsコントローラでnewアクションから入力されたログインフォームからPOSTされた値をこのcreateアクションで処理します。ログインフォームのパラメーターよりemailカラムと一致するユーザーを探し、変数ユーザーに代入。その後、ユーザーが存在し、かつ認証が通った場合のみif文がtrueとなりログインができるようになります。

 if user && user.authenticate(params[:session][:password])

この部分のuser &&はuserがnilだった場合はその時点でuser.authenticate部分は実行されずにelse以降の分岐に行くようになっています。ここはぼっち演算子を用いて

  if user&.authenticate(params[:session][:password])

このような形でも書くことができます。

findとfind_byの違いは?どうしてcurrent_userメソッドではどうしてfind_byを使ってるの?

find・・・引数に取るのはid属性。値がnilだった場合に例外を返す。

find_by・・・引数にid以外の属性も取れる。値がnilだった場合はそのままnilを返す。

current_userメソッドはこんな感じで定義されてました。

#app/helpers/sessions_helper.rb

# 現在ログイン中のユーザーを返す(いる場合)
  def current_user
    if session[:user_id]
      @current_user ||= User.find_by(id: session[:user_id])
    end
  end

current_userメソッドで何故find_byが使われているかというと、セッションにユーザーIDが存在せずnilとなる場合が想定される為です。findを使ってしまうとnilとなった時点でエラーが発生してしまいますので不都合な実装となってしまいます。

既存のUserのパスワードリセット機能作るならどうやって作る?schemaはこんな感じ

create_table "users", force: :cascade do |t|
  t.string "email"
  t.string "password_digest"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

ユーザーがパスワードリセットボタンを押し、リセットフォームにemailを入力するとユーザーアドレスにメールがいき、そのメールに添付されているリンクをクリックするとパスワード再設定画面に飛び再設定できるような仕様にします。テーブルにはリセットトークンをハッシュ化した物を保存するカラム(reset_digest)とreset_sent_atカラム(パスワードリセットに有効期限を設ける為、再設定メールの送信時刻を記録)するカラムを設定します。

作成の大まかな流れは テーブル・モデル作成→ルーティング作成→コントローラー作成→入力フォーム作成→メイラー作成

今回は以上です!明日は残りの第14章やっていきます!