静的型付け言語原理主義者によるRailsチュートリアル(第3章)

image

第3章 ほぼ静的なページの作成

  • Rails は動的なWebサイトを開発するように設計されているが、静的なページを作ってみる
  • 自動化テストにも触れるよ!

3.1 セットアップ

  • 今までと同様に Gemfile 更新
    • test グループだけちょっと異なる
    • これらの gem が何をサポートしてくれるのだろうか
  • 安定の bundle update からの bundle install --without production
  • GitHub にリポジトリを作成して Heroku へ push
  • Rails のデフォルトページは Heroku 上でうまく表示されない仕様らしいので ApplicationController を微修正して push
    • なんでうまく表示されないのか?
  • heroku に展開するときにエラーが表示された場合は heroku logs コマンドで本番環境のログが取得できる

3.2 静的ページ

  • まずは Rails のアクションやビューを使って静的ページを作成し、その後動的ページに作り変えていく
  • コントローラとは基本的に動的な Web ページの集合を束ねるコンテナのこと
  • rails generate でコントローラを生成
    • アクション名をまとめて指定できる
      • rails grails generate の短縮形
      • rails s とかも可能
      • bundle install の短縮形は bundle
        • なんでや!
  • rails generate するときにコントローラ名をキャメルケースで渡すと、コントローラ名をスネークケースにしたファイルが自動的に生成される
    • スネークケースがクラス名になっているのが慣れない。。。
    • Rails の generate スクリプトでは underscore メソッドでキャメルケースをスネークケースに変換している
  • rails generate で作成したコントローラ名を変更したい場合は rails destory でコントローラだけでなく、既存ファイルに挿入されたコードもまとめて削除できる
  • DB のマイグレーションももとに戻すことができる
    • 強すぎでは
    • db rollback
      • 簡単すぎる。。。
  • Ruby にも継承はある
    • ApplicationController を継承しているだけでRails 特有の振る舞いをすることになる
      • アクションに対応するビューが出力される
  • Home と Help の html を修正
    • 拡張子は .html.erb
      • .erb は eRuby のこと
      • html へ Ruby スクリプトを埋め込める
        • 本当に Rails 側で全部やるんだなあ
    • html もよくわからん
      • 最後に触ったのは何年前か

3.3 テストから始める

  • まずはコントローラのテストから
  • コードよりも先にテストを書く
    • 面倒な部分は既に Railsが 面倒を見てくれているらしい
      • とことん隠蔽してくるな。。。
  • rails test でテストが実行される
  • テスト実行に時間がかかる
    • その一因は Spring サーバーを起動しているから
    • ここでいう Spring とは?
      • アプリケーションプリローダーのこと
      • Java は関係ない
      • Rails 内では様々なライブラリのロードなどの前処理が行われるので、コマンドを実行するための待ち時間がかかってしまう
      • 事前にバックグラウンドでライブラリをロードしておくことで、その待ち時間を短くする
      • なので時間がかかるのは最初の一回だけ
  • 先に失敗するテストを書く
    • TDD!TDD!
  • routes.rbget 'static_pages/about' を追加することによりヘルパーが使えるようになる
  • 再度テスト実行してもアクションがないのでやはり Red
  • コントローラにアクションを追加してもまだ Red
    • テンプレート、すなわちビューがない
  • touch コマンドで erb ファイルを作成
    • touch コマンドは本来タイムスタンプを更新するだけのものだが、ファイルが存在しない場合は作成される
      • 知らなかった
  • erb を追加して再度テスト実行すれば Green
    • やったね
  • コードの腐敗臭はどんな小さな隙間からもやってくる
  • だからこまめにリファクタリングしてコードを常にきれいに保つ必要がある
    • そのためのテスト

3.4 少しだけ動的なページ

  • 作成した静的ページを動的変更する
  • assert_select メソッドで特定の html タグが存在するかどうかのテストが可能
    • あまりやったことのないテストだ
  • html.erb ファイルを更新してテストを Green に
  • テストに setup メソッドを追加して共通化
  • 埋め込み Ruby で重複を取り除いていく
  • provive メソッドでタイトルをページごとに変更する
    • Ruby を html に埋め込んでいく
    • なるほどだから erb なのか!
      • erb は Web ページに動的な要素を加えるときに使うテンプレートシステム
  • <% ... %> は中に書かれたコードを実行するだけ
  • <%= ... %> は中のコードの実行結果がテンプレートの該当部分に挿入される
  • すべてのページの構造を同じものに寄せていく

    • そのための application.html.erb
    • <%= yield %> という特殊なコード

      • 各ページの内容をレイアウトに挿入する

        <%= csrf_meta_tags %>
        <%= stylesheet_link_tag ... %>
        <%= javascript_include_tag "application", ... %>
  • 上記 erb はそれぞれスタイルシート, JavaScript, csrf_meta_tags メソッドをページ内で展開するためのもの

    • スタイルシートと JavaScript は Asset Pipeline の一部
      • Asset Pipeline とは
        • JavaScript や CSS のアセットを minify または圧縮して連結するためのフレームワーク
        • 詳しくは5.2.1章で
    • csrf_meta_tags はクロスサイトリクエストフォージェリーの防衛用Railsメソッド
  • html 構造を削除したページに更新していく

    • テストがある安心感!
  • ルーティングの設定を変更

    • routes.rb に1行追加するだけでヘルパーが使えるようになるのはまだ慣れない。。。

3.5 最後に

  • ブランチをマージして heroku にデプロイして終わり
    • heroku でも動いている!(当たり前)

3.6 高度なセットアップ

  • Cloud9 テスト結果表示が見やすくなった
  • おそらく Rails チュートリアルが AmaxonLinux 前提で説明されているため、Linux コマンドでちょっとハマる
  • CentOS で yum だったのは Ubuntu では apt-get
    • CentOS は少しだけ触っていたが Ubuntu は初めてなのでささいなところでつまづく
      • おとなしく AmazonLinux を選択しておくべきだったか。。。
  • .gitignore に Spring を追加
    • Spring は挙動が若干不安定らしい
    • テスト実行が異常に遅いときはプロセスを見て適宜 Spring を kill すべし
  • gurad の設定を行いテストが自動で走ることを確認
    • 便利だけどテスト数増えたらいちいち自動実行するとパフォーマンス悪くなるよなあ。。。
    • そのへんってうまくできているのだろうか?
    • それとも普通に OFF にするだけ?

所感

Ruby が組み込みで動くこと、チュートリアルがテストファーストを徹底してくること、html のテストを書くことなど、意外続きの3章だった。一箇所修正するだけで各所に影響を及ぼす Rails の感じにも少しずつ慣れてきた感。むしろ心地よくなってきているような…?


2219 Words

2019-11-27 13:32 +0000