今日やること

  • Rails Tutorial 8~9章 (スピーダッ!
  • 文章ゼミ課題 エッセイ 1回目書き直し・提出
  • できれば読書

やったこと

  • Rails Tutorial 8章
  • 文章ゼミ課題 エッセイ 1回目書き直し・提出
  • Vim基本操作おさらい
    • 今日見つけたこのページとか初心者のVim入門によさげ
    • ステップ1まででも高機能エディタあんまり使いこなしてない人には充分そう
    • ステップ2相当+検索・置換+α(複数行・行数指定選択とか)程度でもほぼ困らないと思う
    • ただしctrl+zは大抵の人の環境ではundoとは違う挙動(バックグラウンド実行&swapファイル生成)なので注意
    • あと、ステップ5にもズバリそのものは書いてない(Vは応用として読み取れる)けど
      V(Shift+v)[→G(Shift+g)]で現在行[以下全]選択とか
      gg=Gでインデント自動整形とかよく使うかな

Rails Tutorial 8&9章の目的

  1. ブラウザを閉じるとログインを破棄する (Session)
  2. ユーザーのログイン情報を自動で保存する (Cookie)
  3. ユーザーがチェックボックスをオンにした場合のみログインを保存する (Remember me)
    という3つの一般的なログイン機構を実装する

#Rails Tutorial Tips

  • HTTPはステートレス (Stateless=「状態」が無い) なプロトコル
    • リクエスト1回ごとに前のことはきれいさっぱり忘れる健忘症のような独立トランザクション
    • 故に非常に頑丈
  • RESTfulの考え方に従い、1つの機能ごとに1つのControllerと各アクションを設定する
    • index, show, new,edit (GET)
    • create(POST)
    • update(PATCH/PUT)
    • destroy(DELETE)

(例)Usersリソースが提供するRESTfulなルート

HTTPリクエスト URL アクション 名前付きルート 用途
GET /users index users_path すべてのユーザーを一覧するページ
GET /users/1 show user_path(user) 特定のユーザーを表示するページ
GET /users/new new new_user_path ユーザーを新規作成するページ (ユーザー登録)
POST /users create users_path ユーザーを作成するアクション
GET /users/1/edit edit edit_user_path(user) id=1のユーザーを編集するページ
PATCH/PUT /users/1 update user_path(user) ユーザーを更新するアクション
DELETE /users/1 destroy user_path(user) ユーザーを削除するアクション
  • 全ルーティングを表示
    rails routes
$ rails routes | grep users  
   signup GET    /signup(.:format)         users#new  
          POST   /signup(.:format)         users#create  
    users GET    /users(.:format)          users#index  
          POST   /users(.:format)          users#create  
 new_user GET    /users/new(.:format)      users#new  
edit_user GET    /users/:id/edit(.:format) users#edit  
     user GET    /users/:id(.:format)      users#show  
          PATCH  /users/:id(.:format)      users#update  
          PUT    /users/:id(.:format)      users#update  
          DELETE /users/:id(.:format)      users#destroy  

TDD(テスト駆動開発)統合テスト手法おさらい

ログイン処理失敗時のflash[:danger]メッセージが画面に残ってしまうバグへの対処

  1. ログイン用のパスを開く
  2. 新しいセッションのフォームが正しく表示されたことを確認する
  3. わざと無効なparamsハッシュを使ってセッション用パスにPOSTする
  4. 新しいセッションのフォームが再度表示され、フラッシュメッセージが追加されることを確認する
  5. 別のページ (Homeページなど) にいったん移動する
  6. 移動先のページでフラッシュメッセージが表示されていないことを確認する

上記テスト手順を以下のコード(それぞれ5~11行目に対応)で実装

・まず統合テスト用ファイル生成

$ rails generate integration_test users_login  

"(アプリケーションルート)/test/integration/users_login_test.rb"を編集

【フラッシュメッセージの残留をキャッチするテスト】

画面遷移後にflashメッセージの残存がある(RED)場合、テスト実行結果は以下のようになる

 FAIL["test_login_with_invalid_information", UsersLoginTest, 2.9922376999993503]  test_login_with_invalid_information#UsersLoginTest (2.99s)  
        Expected false to be truthy.  
        test/integration/users_login_test.rb:12:in `block in <class:UsersLoginTest>'  

  22/22: [==================================] 100% Time: 00:00:03, Time: 00:00:03  

Finished in 3.48731s  
22 tests, 52 assertions, 1 failures, 0 errors, 0 skips  

※(要調査)
QrunchのマークダウンではQiitaのように
```ruby:test/integration/users_login_test.rb
でファイル名表示はできない仕様?


「Ruby的に」正しい短縮記述法

以下は@current_user = @current_user || User.find_by(id: session[:user_id])と同義

@current_user ||= User.find_by(id: session[:user_id])  

@current_userがnil = ログイン中のユーザーが居ない = 有効なセッションが無い時だけDBアクセス

こういう細かい処理の書き方ひとつから不要な負荷や脆弱性を軽減しようとする意識は大事だと思う。


ログイン状態とそうでない場合の処理分け確認統合テスト
  • 開発環境(develop)用のDBに登録のあるユーザーを使わず、別にテスト用データをfixtureで作成する

Rubyの複数行コメントアウト
=begin  
(この間全てコメントアウト)  
=end  

他の言語の複数行コメントよりちょっと面倒
その分記号だけより(特に色分けが無い場合)見落としにくいのがメリット?


まとめ

  • この記録自体が要約なので無理に毎回まとめ書かなくてもいい気がする。
  • 既にProgateで覚えたこと等は基本的に(メモとしては)飛ばす。
  • 依然として学習ペースが予定より遅れ続けてるので更なる努力が必要。

反省点

  • 2章進める筈が1章だけで日付変更前
  • 他のことほぼしてない筈だが。
  • 根本的に計画・見積もりが甘いか生産性が低い(つまり仕事が遅い)
  • 慢性的に生産性が低いのだとすれば加齢による衰えや元々の能力値の問題ではなく集中力の問題か?
    • 「ADHD重度だから」って言い訳や自虐しても意味ないからそんなヒマあったらとにかくカイゼン
  • 習慣・環境を変えることで集中力を取り戻せばパフォーマンスは上がる前提で創意工夫・試行すべし
  • とりあえず一回スタンディングデスク前でスタンディングスリープしてもし前方以外に倒れてたら危なかったから今日は早め長めに寝よう。
  • いっそ睡眠時間倍&PCに向き合う時間半分にした方が処理速くなったりするかもしれない
  • まぁ、うまくいかなくても死にゃしない。
  • 何がどうだろうがいつもいい気分でいることの方が大事。

明日やること

  • Rails Tutorial9~10章
  • 文章ゼミ 合評