ひろしとRailsチュートリアルと - 最終回 : 軽い気持ちで始めたら結局xx時間かかった
Rails Tutorialを始めてから、ちょうど1ヶ月。 全14章のチュートリアルがやっと終わった 🎉
実は勉強ログをTogglで計測していたので、そのログも載せつつ振り返りしたいと思います。
続きを読むひろしとRailsチュートリアルと - その4 : 認可, パスワード再設定
長かったチュートリアルももう終盤。。(›´ω`‹ )
認証に関わるチュートリアルが続いてなかなかのボリュームだった。
10章 (ユーザーの更新・表示・削除)
ログインしてなくても誰かのユーザー情報が編集できてしまう超絶ヤバイ状態から認可の仕組みを導入した。
フレンドリーフォワーディングでは、遷移先の保存に session
を再度利用した。
will_paginate gem
を使ってページネーションを実装したが、JSで昔スクラッチで書いたときに比べてめちゃくちゃ楽で驚いた。
before_action
を使ったフィルタ (ログイン済みチェック / 自分の編集ページかチェック)- フレンドリーフォワーディング (ログイン後、ログイン前にアクセスしようとしたページに戻してあげるやつ)
- ユーザー一覧
- ページネーション
を学んだ。
11章 (アカウントの有効化)
メーラーを使ってユーザーが本当にそのメールアドレスの持ち主なのか検証する仕組みを実装した。
- メーラーも
rails generate
で生成できる。 (plainText / html) - プレビュー用のclassが自動生成され、
config/environments/development.rb
を編集するとメールを送らなくてもメールの確認ができる←便利
ことを学んだ。
Rubyのメタプログラミングを使った抽象化を体験した。
下記の例だと、 send
メソッドで引数にシンボル名と同じStringを指定し、動的にシンボルを取得している。
まじか、黒魔術すぐる..といった感想😨
def authenticated?(remember_token) digest = self.send("remember_digest") return false if digest.nil? BCrypt::Password.new(digest).is_password?(remember_token) end
↓
def authenticated?(attribute, token) digest = send("#{attribute}_digest") return false if digest.nil? BCrypt::Password.new(digest).is_password?(token) end
12章 (パスワード再設定)
11章の振り返りのようなメーラーを使ったパスワードリセットの仕組みを作った。
ところどころ Controller
の責務過多な部分を User
モデルや SessionHelper
に逃すリファクタが演習に含まれていて普通にリファクタリングの勉強になる。
パスワードリセットやアカウント有効化の実装はフロントエンドなら経験があったが、概念だけ分かってる部分もサーバーサイドの実装を経験することによってより理解が深まって良かった。
ひろしとRailsチュートリアルと - その3 : アカウント作成, ログイン
本業のiOS開発がバタバタしていて、前回から2週間空いてしまった。 今日は7, 8, 9章を進めた。
7章
ユーザーページの作成とアカウント作成画面を実装した。
- debugメソッド
- Railsが用意している環境3つ(test, development, production)
- User.find(params[:id])してユーザーページの表示
- ユーザーのGravatarを表示する初めてのヘルパーメソッド
- formでpost -> createメソッドでパラメータを受け取ってControllerでロジック実装
- エラーハンドリング
- Strong Prameters
- 本番環境でSSLを使う方法
を学んだ。
サイトにデバッグ情報を出力できる debug(params)
メソッド。
アプリで同じようなことをやろうとすると、ライブラリを使うか、log出力用の関数を自分で書かないといけないので、こういった需要に応じたメソッドが用意されてるのはフレームワークの素晴らしさだと思った。
Strong Parameters
を使うことで、paramsハッシュのパラメータを指定できること。これを使わないとcurlとかで容易に悪意あるリクエストが送れることを学んだ。
なんかこの章めっちゃ長くて、Togglで勉強時間を計測しているのだが、3時間半近くかかって疲れた。。
8章
7章(アカウント作成)の知見が活かせて、1/3の時間で終わった。
- ログイン
- ログアウト
- SessionsHelper moduleを定義して、session管理のヘルパーメソッドを実装
- Sessionに応じた画面の出しわけ
- ||= 演算子を使った代入
を学んだ。
||=
演算子は左辺がnilだったら右辺で代入するやつで、swiftの ??
演算子みたいな感じで便利だなと思った。
9章
cookieを使ったsessionの永続化を学んだ。なんとなく知識として分かってはいたが、体系的に自分で実装して学べてよかった。 以下、簡易メモ
セッションの保持
ログイン時
途中、cookieにtokenを保存する箇所で盛大にバグを埋め込んでて、そのまま気づかず過ごしていたのだが章の終盤のテストでバグが明らかになって、テストの素晴らしさを体感した。
作業環境
外で作業するときに、家と違ってサブディスプレイがないのがツラみだったのだが、iPadをサブディスプレイ化する Duet Displayというアプリを見つけて、買ってみたら遅延なくて最高だった。ノマドワークが捗りそう。
iPadをmacのサブディスプレイにするアプリ買ってみた…これ、、神なの? pic.twitter.com/YHNyBhA8L3
— Objective-ひろC (@hirothings) 2018年5月19日