静的型付け言語原理主義者によるRailsチュートリアル(第3章)
第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 g
はrails generate
の短縮形rails s
とかも可能bundle install
の短縮形はbundle
- なんでや!
- アクション名をまとめて指定できる
rails generate
するときにコントローラ名をキャメルケースで渡すと、コントローラ名をスネークケースにしたファイルが自動的に生成される- スネークケースがクラス名になっているのが慣れない。。。
- Rails の generate スクリプトでは underscore メソッドでキャメルケースをスネークケースに変換している
rails generate
で作成したコントローラ名を変更したい場合はrails destory
でコントローラだけでなく、既存ファイルに挿入されたコードもまとめて削除できる- DB のマイグレーションももとに戻すことができる
- 強すぎでは
db rollback
- 簡単すぎる。。。
- Ruby にも継承はある
- ApplicationController を継承しているだけでRails 特有の振る舞いをすることになる
- アクションに対応するビューが出力される
- ApplicationController を継承しているだけでRails 特有の振る舞いをすることになる
- Home と Help の html を修正
- 拡張子は
.html.erb
.erb
は eRuby のこと- html へ Ruby スクリプトを埋め込める
- 本当に Rails 側で全部やるんだなあ
- html もよくわからん
- 最後に触ったのは何年前か
- 拡張子は
3.3 テストから始める
- まずはコントローラのテストから
- コードよりも先にテストを書く
- 面倒な部分は既に Railsが 面倒を見てくれているらしい
- とことん隠蔽してくるな。。。
- 面倒な部分は既に Railsが 面倒を見てくれているらしい
rails test
でテストが実行される- テスト実行に時間がかかる
- その一因は Spring サーバーを起動しているから
- ここでいう Spring とは?
- アプリケーションプリローダーのこと
- Java は関係ない
- Rails 内では様々なライブラリのロードなどの前処理が行われるので、コマンドを実行するための待ち時間がかかってしまう
- 事前にバックグラウンドでライブラリをロードしておくことで、その待ち時間を短くする
- なので時間がかかるのは最初の一回だけ
- 先に失敗するテストを書く
- TDD!TDD!
routes.rb
にget '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章で
- Asset Pipeline とは
csrf_meta_tags
はクロスサイトリクエストフォージェリーの防衛用Railsメソッド
- スタイルシートと JavaScript は Asset Pipeline の一部
- html 構造を削除したページに更新していく
- テストがある安心感!
- ルーティングの設定を変更
routes.rb
に1行追加するだけでヘルパーが使えるようになるのはまだ慣れない。。。
3.5 最後に
- ブランチをマージして heroku にデプロイして終わり
- heroku でも動いている!(当たり前)
3.6 高度なセットアップ
- Cloud9 テスト結果表示が見やすくなった
- おそらく Rails チュートリアルが AmaxonLinux 前提で説明されているため、Linux コマンドでちょっとハマる
- CentOS で
yum
だったのは Ubuntu ではapt-get
- CentOS は少しだけ触っていたが Ubuntu は初めてなのでささいなところでつまづく
- おとなしく AmazonLinux を選択しておくべきだったか。。。
- CentOS は少しだけ触っていたが Ubuntu は初めてなのでささいなところでつまづく
.gitignore
に Spring を追加- Spring は挙動が若干不安定らしい
- テスト実行が異常に遅いときはプロセスを見て適宜 Spring を kill すべし
- gurad の設定を行いテストが自動で走ることを確認
- 便利だけどテスト数増えたらいちいち自動実行するとパフォーマンス悪くなるよなあ。。。
- そのへんってうまくできているのだろうか?
- それとも普通に OFF にするだけ?
所感
Ruby が組み込みで動くこと、チュートリアルがテストファーストを徹底してくること、html のテストを書くことなど、意外続きの3章だった。一箇所修正するだけで各所に影響を及ぼす Rails の感じにも少しずつ慣れてきた感。むしろ心地よくなってきているような…?