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-pagesmasterブランチにマージします.

3.6 高度なセットアップ

3.6.1

色付きで進捗状況が表示されるようになりました.

3.6.2

テストの自動化はDocker環境でも問題ないのでしょうか...? ひとまず試してみます.

docker-compose exec -T web bundle exec guard init

Guardfileが作成されるので, 指示通りに書き換えます. Gitspring 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章終えましたああ〜〜.