(ギリ)20代の地方公務員がRailsチュートリアルに取り組みます【第3章】


前提

・Railsチュートリアルは第4版
・今回の学習は3周目(9章以降は2周目)
・著者はProgate一通りやったぐらいの初学者

基本方針

・読んだら分かることは端折る。
・意味がわからない用語は調べてまとめる(記事最下段・用語集)。
・理解できない内容を掘り下げる。
・演習はすべて取り組む。
・コードコピペは極力しない。

いよいよメインのsample_appが始まる第3章。
この章から学習のお供に、本日のBGM入れていきます。気分転換にどうぞ。
羊文学 "人間だった"

 

【3.1 セットアップ 演習】

 gemファイルのインストールでさっそく赤字エラー吐きますが、bundle updateして再度インストールすれば解決します。
そして、herokuへデプロイするところでまたエラー。Precompiling assets failedの赤文字が。プリコンパイルだから、コンパイルする前の段階でエラー?ログを辿ってエラー吐いてる箇所を調べてもNoMethodError: undefined method `action_mailer'くらい?結局調べても分からなかったので、再度gemファイルを書き直してbundle updateしたら無事デプロイできました。

1. BitbucketがMarkdown記法のREADME (リスト 3.3) をHTMLとして正しく描画しているか、確認してみてください。
→ 私の場合はGithubですが、正しく描画されていました(画像割愛)。

2. 本番環境 (Heroku) のルートURLにアクセスして、デプロイが成功したかどうか確かめてみてください。
→ hello, world!が表示されていました。

 

【3.2.1 静的なページの生成 演習】

 メモ1:コラム3.1 元に戻す方法 に生成したコードやマイグレーションの戻し方が掲載されている。
メモ2:HTTPの基本的な4つの操作⇨GET、POST、PATCH、DELETE

1. Fooというコントローラを生成し、その中にbarとbazアクションを追加してみてください。
→ 下記コードで生成。

$ rails g controller Foo bar baz

2. コラム 3.1で紹介したテクニックを駆使して、Fooコントローラとそれに関連するアクションを削除してみてください。
→ 下記コードで削除。

$ rails destroy controller Foo bar baz

 

【3.3 テストから始める】

 ついに来ましたテスト。最初はわけわからん状態でしたが、今なら少し理解できます。要は「こう動作するよね?ね??(もしくは、こうは動作しないよね??)」と期待する動きを先に書いて確かめるためのものです。テストを書くためには、(当たり前かもですが)アプリの設計図を先に描いている必要があります。コラム3.3で「後で」書くとなっている場合は、動作の仕様が固まり切っていないか、すぐにまた変更しそうなコードの場合のみです。基本は「先に」書くことがベースのようです。
テストの詳しい内容はRailsガイドのテスティングガイドを読んだ方がいいかも。すごい分量なので、追々見ていきます。アサーションの種類なんかも一部載っています。このチュートリアルに出てくるものは記事下の用語集にまとめていくことにします。その方が覚えられそうなので。

【3.4.2 タイトルを追加する(Green) 演習】

1. StaticPagesコントローラのテスト (リスト 3.24) には、いくつか繰り返しがあったことにお気づきでしょうか? 特に「Ruby on Rails Tutorial Sample App」という基本タイトルは、各テストで毎回同じ内容を書いてしまっています。そこで、setupという特別なメソッド (各テストが実行される直前で実行されるメソッド) を使って、この問題を解決したいと思います。まずは、リスト 3.30のテストが green になることを確認してみてください (リスト 3.30では、2.2.2で少し触れたインスタンス変数や文字列の式展開というテクニックを使っています。それぞれ4.4.5と4.2.2で詳しく解説するので、今はわからなくても問題ありません)。
→ リスト3.30のとおり入力するだけ。

 

【3.4.3 レイアウトと埋め込みRuby(Refactor) 演習】

1. サンプルアプリケーションにContact (問い合わせ先) ページを作成してください16 (ヒント: まずはリスト 3.15を参考にして、/static_pages/contactというURLのページに「Contact | Ruby on Rails Tutorial Sample App」というタイトルが存在するかどうかを確認するテストを最初に作成しましょう。次に、3.3.3でAboutページを作ったときのと同じように、Contactページにもリスト 3.40のコンテンツを表示してみましょう。)。
→ まずはテストを作成。もちろん結果はエラーです。

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

ルーティングにcontactを、コントローラにcontactアクションをそれぞれ追加、ビューページを作成してリスト3.40を入力すればテストをパスします。

routes.rb
Rails.application.routes.draw do
  get 'static_pages/home'
  get 'static_pages/help'
  get 'static_pages/about'
  get 'static_pages/contact'

  root 'application#hello'
end

static_pages_controller
def contact
end
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. ルーティングの設定 演習】

1. リスト 3.41にrootルーティングを追加したことで、root_urlというRailsヘルパーが使えるようになりました (以前、static_pages_home_urlが使えるようになったときと同じです)。リスト 3.42のFILL_INと記された部分を置き換えて、rootルーティングのテストを書いてみてください。
→ 下記

static_pages_controller_test.rb
  test "should get root" do
    get root_url
    assert_response :success
  end

 
2. 実はリスト 3.41のコードを書いていたので、先ほどの課題のテストは既に green になっているはずです。このような場合、テストを変更する前から成功していたのか、変更した後に成功するようになったのか、判断が難しいです。リスト 3.41のコードがテスト結果に影響を与えていることを確認するため、リスト 3.43のようにrootルーティングをコメントアウトして見て、 red になるかどうか確かめてみましょう (なおRubyのコメント機能については4.2.1で説明します)。最後に、コメントアウトした箇所を元に戻し (すなわちリスト 3.41に戻し)、テストが green になることを確認してみましょう。
→ たしかにコメントアウトの前後でテストの結果が変わります。

第3章まとめ

・Webアプリの基本となる(ほぼ)静的なページを一通り作成。RESTfulではないので、ルーティングはそれぞれ個別に設定。
・基本的にテストは先に書く。想定する動作を頭にしっかり描くことが大切。
・テストを整備しておくと、リファクタリングの際に安心。
・ビューの共通部分は、/layouts/application.html.erbにまとめることができる。
・コントローラで定義した変数はERBファイルで使用できる。

次、第4章行ってみよー
 

⇨ 第4章へ!
⇦ 第2章はこちら
学習にあたっての前提・著者ステータスはこちら
 

なんとなくイメージを掴む用語集

・コンパイル(compile)
 人間語から機械語に翻訳すること。私たちが書いたプログラムを、直接はコンピュータ側で理解できないので、分かるように変換する必要があるようです。

・リファクタリング (refactoring)
プログラムの外部から見た動作を変えずにソースコードの内部構造を整理すること。リファクタリングの都度テストを行うことが重要。

・SEO (Search Engine Optimization: 検索エンジン最適化)
 SEO対策=検索結果の上位に表示させるようにすること。Webマーケティングにおいて重要。

・assert_response
 レスポンスが特定のステータスコードを持っていることを主張する。:successを指定するとステータスコード200-299を指定したことになる。(ステータスコード一覧

・assert_select
ある指定された要素が、条件に一致するかどうかを調べる。便利なアサーションかも。2つの書式があります。詳しくはRailsガイドへ。