Railsチュートリアル 第3章
Railsチュートリアルの第3章を進めた際のメモです. チュートリアルに書かれていることは書かないようにしています. かなり個人的なメモですから, 参考程度にご覧ください.
3.1 セットアップ
Dockerを使って環境を構築しました. 詳しくはこちらで解説しています.
その他は省略します.
3.2 静的ページ
トピックブランチを作成しチェックアウト.
git checkout -b static-pages
3.2.1
rails
コマンドはコンテナの中で実行しなくてはなりませんから, docker-compose exec
を使うとよいでしょう.
docker-compose exec -T web rails generate controller StaticPages home help
デフォルトでは標準入出力にTTYが割り当てられてしまいますが, オプション-T
でそれをオフにしています.
rails destroy
も試したあと, git commit
しておきました.
3.3 テストから始める
「テスト駆動」にするのか「一括テスト」にするのかについてのガイドラインは, 今後ためになりそうですね.
3.3.1
テストを実行します.
docker-compose exec -T web rails test
気なる文字列が表示されましたが, テストはうまくいったようです.
Running via Spring preloader in process 168 /myapp/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /myapp/config/application.rb to limit the frameworks that will be loaded. Run options: --seed 47859 # Running: .. Finished in 1.537890s, 1.3005 runs/s, 1.3005 assertions/s. 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
3.3.2
指示通り実行し, テストはひとつだけ失敗しました. テストコードはDRY原則にあてはまっていないですが, これはきっと3.4.3でやるんでしょうね.
3.3.3
ルーティングの設定を書き加えて再びテストを実行します. テストは失敗しますが, エラーメッセージが変わりました.
アクションを追加してテストを実行します. テストは失敗しますが, またエラーメッセージが変わりました.
Viewファイルを追加することにより, やっとテストにパスしました. ブラウザでも確認ができました.
3.4 少しだけ動的なページ
レイアウトが自動設定されないように, レイアウトファイルの名前を変更しておきます. ただしGitにそれを知らせるため, git mv
コマンドを使います.
git mv application.html.erb layout_file
3.4.1
テストを書き, 失敗することを確認.
3.4.2
タイトルを追加し, テストをパス.
演習1
テストコードには繰り返しの部分がたくさんあったので, インスタンス変数でまとめます.
3.4.3
レイアウトを利用することで, 各Viewファイルがかなりスッキリしました.
演習1
まずテストコードを書きます.
# test/controllers/static_pages_controller_test.rb test "should get contact" do get static_pages_contact_url assert_response :success assert_select "title", "Contact | #{@base_title}" end
テストを実行し, 正しいエラーメッセージが出ることを確認します.
$ docker-compose exec -T web rails test NameError: undefined local variable or method `static_pages_contact_url'
URLがないというエラーがでているので,ルーティング設定を追加しましょう.
# config/routes.rb Rails.application.routes.draw do get 'static_pages/home' get 'static_pages/help' get 'static_pages/about' get 'static_pages/contact' # 追加 end
再びテストを実行すると, エラーメッセージが変わります.
$ docker-compose exec -T web rails test AbstractController::ActionNotFound: The action 'contact' could not be found for StaticPagesController
アクションがないというエラーが出ているので, アクションを追加しましょう.
# app/controllers/static_pages_controller.rb class StaticPagesController < ApplicationController #追加 def contact end end
再びテストを実行すると, さらにエラーメッセージが変わります.
$ docker-compose exec -T web rails test ActionController::UnknownFormat: StaticPagesController#contact is missing a template for this request format and variant.
Viweファイルがないというエラーが出ているので作りましょう.
# app/views/static_pages/contact.html.erb <% provide(:title, "Contact") %> <h1>Contact</h1> <p> Contact the Ruby on Rails Tutorial about the sample app at the <a href="https://railstutorial.jp/contact">contact page</a>. </p>
テストもパスし, ブラウザでも確認することができます.
3.4.4
rootルーティングの設定をしました.
演習1
テストコードを追加し, テストを実行します. パスできました.
次にrootルーティングの設定をコメントアウトしてテストを実行します. すると以下のようなエラーメッセージが表示されました.
NameError: undefined local variable or method `root_url'
コメントアウトを外すとテストをパスできます.
3.5 最後に
現在のトピックブランチであるstatic-pages
をmaster
ブランチにマージします.
3.6 高度なセットアップ
3.6.1
色付きで進捗状況が表示されるようになりました.
3.6.2
テストの自動化はDocker環境でも問題ないのでしょうか...? ひとまず試してみます.
docker-compose exec -T web bundle exec guard init
Guardfile
が作成されるので, 指示通りに書き換えます. Git
がspring files
を追跡しないように.gitignore
を編集します.
以下のコマンドを実行し, Guardをオン?にします.
$ docker-compose exec -T web bundle exec guard 05:38:32 - INFO - Guard::Minitest 2.4.6 is running, with Minitest::Unit 5.11.3! 05:38:34 - INFO - Guard is now watching at '/myapp' [1] guard(main)>
するとプロンプトが表示されたので, そのままEnterを押しました. するとテストが実行されて, 再び同じプロンプトが表示され待機状態になりました. exit
を入力することで抜けられました.
[1] guard(main)> exit exit 05:39:05 - INFO - Bye bye...
これでいいんでしょうか...?
05:39:05
などの数字は時刻っぽいですね. でも現時刻は14:41
. つまり世界標準時が表示されるようになっているようです.
以上で3章終えましたああ〜〜.