Rails

挫折しないRailsチュートリアルのまとめ【第3章】

Railsチュートリアルの3章を走破しました。

2章までは自分なりにまとめたりしてましたが、3章からはやったこと、つまずいたことのメモにしようと思います。

3章の内容

ほぼ静的なページを作成しながら以下を学習する。

3章の内容
  • コントローラの自動作成方法
  • コントローラの手動作成方法
  • 自動テスト方法
  • テストから行う開発方法
  • ビューの構成(レイアウト)

3.1 セットアップ

「sample_app」というRailsアプリケーションを作成します。

Railsアプリケーションの作成(rails new)

自分は推奨環境であるAWS Cloud9で学習していたので、1章、2章と同じワークスペースに作成しました。

今回はなんでバージョン指定っぽいのが入ってるんだろう?と思ったら、1章、2章でも指定していましたね。

バージョンを省略すると、環境にインストールされている最新のRailsでアプリケーションが作成されるため、RailsチュートリアルでインストールしたRailsのバージョンで進めるためにバージョンを指定しているんですね。
(バージョンが異なるとテキストと異なる挙動をする可能性があるため)

1章、2章では完全に見落としてましたが、AWS Cloud9の環境にはRailsチュートリアルで使用しているRails5.1.6しかインストールされていないので、助かってたんですね。

rails newでバージョンを指定する理由はこちらを参照させていただきました。
Railsチュートリアルでrails newするときはバージョンを指定しよう

あと役に立ちそうなRails newのよく使うオプション一覧
rails newするときによく使うオプションと、rails newした後によく行う設定

Gemfileの修正

Railsチュートリアルに記載されている内容にGemFileを書き換えます。

GemFileに場所は「sample_app/Gemfile」です。

bundle install

本番(production)環境用のgemはインストールしないように「–without production」オプションを使用して「bundle install」を実行

「bundle update」をしろと怒られます。

ちなみに「bundle install –without production」を実行したタイミングで、「sample_app/.bundle/config(隠しファイル)」が以下のようになり、本番環境にデプロイする時に本番環境用のgemがインストールされないようになっているので、本番環境にデプロイするときは記述内容を削除(コメント化)する必要があります。

では、「bundle update」を実行します。

「rails-controller-testing 1.0.2」がないと怒られます。

以下の記事で「bundle install」と「bundle update」の違いを確認してみます。
「Gemfile」と「Gemfile.lock」の違いまで書かれていて分かりやすいです。
bundle install と bundle updateの違いについて

「bundle update」を「Gemfile」をもとにインストールするので、「Gemfile」に記載されている「gem ‘rails-controller-testing’, ‘1.0.2’」はもうインストールできないってことなのでしょうか?

gemをインストールした結果である「Gemfile.lock」を確認すると以下の記述があります。

これはrails-controller-testingは2.0がインストールされたということでしょうか。

ちなみに「~>」や「>=」は以下のような意味なので、次に「bundle install」を実行した時に、2.0.1〜2.1のバージョンがあればインストールするということになるので、やっぱりrails-controller-testingは2.0がインストールされているっぽいです。

  • >=バージョン:常に最新バージョンをインストールする
  • ~>バージョン:マイナーバージョンの最新をインストールする

なのでとりあえず先に進めます。

Gitリポジトリを初期化

README.mdを更新

アプリケーションのルートディレクトリにある「README.md」に具体的な作業内容をわかりやすく記入したほうが良いとあるんで、Railsチュートリアルに記載されている「README.md」の内容をコピペし、変更内容をコミットします。

git commitの「-am」オプションは「-a」オプションと「-m」オプションの2つを同時に行ってくれるオプションです。という風にここで説明してますけど、2章でもさらっと使われてましたけど・・・。

Bitbucket上にリポジトリを作成

Bitbucket上にリポジトリ情のリポジトリ作成手順は2章のまとめ記事に書いたのでそちらを参照。

Bitbucketにプッシュ

以下のコマンドを実行して、Bitbucket上のリポジトリにプッシュします。

helloアクションをApplicationコントローラーに追加

1章、2章と同じようにhelloアクションを作成します。

helloアクション用のルーティングを設定する

helloアクションをルートとするようにルーティングを設定します。

変更内容をコミットしてプッシュ。

本番環境のデータベース接続先をPostgreSQLに修正する

本番環境であるHerokuはSQLite3に対応していないため、PostgreSQLに接続するように「config/database.yml」を修正します。

Herokuにデプロイ(プッシュ)する

今までの内容をHerokuにデプロイ(プッシュ)するため、Herokuにアプリケーションの実行場所を作成します。

「未確認アカウントのアプリケーション数の上限(5個)に達してるから作成できないよと」怒られました。

1章、2章でデプロイがうまくいかずに「heroku create」を何回か実行したのが、原因でしょうね。

Herokuアプリケーションの削除

通常であればこの作業は不要

下記の記事を参考にしながらHerokuから不要なアプリケーションを削除します。
【herokuコマンド】createからdestroyまで

ブラウザでHerokuにログインして、アプリケーション名を確認します。


左側の文字列がアプリケーション名になります。

無事削除されました。

他2つも不要なやつなので、削除しておきます。

改めて、Herokuにアプリケーションを作成。

無事成功しました。

そして、Herokuにデプロイ(プッシュします)。

Herokuへのデプロイが成功しているか確認する

「heroku create」コマンド実行時に生成されたURLまたは、「heroku open」コマンドで表示されるURLにアクセスし、「hello, World!」のページが表示されるかを確認します。

演習1

BitbucketがMarkdown記法のREADMEをHTMLとして正しく描画しているか、確認する。

演習2

「Herokuへのデプロイが成功しているか確認する」で確認済み。

3.2 静的ページ

静的ページ作成用のgitのブランチを作成し、チェックアウトする。

3.2.1 静的なページの生成

静的ページ「Homeページ」「Helpページ」「Aboutページ」の3つで構成するので、静的ページ用のコントローラ「StaticPages」と各ページ用のアクションを追加する。

まずは「StaticPages」コントローラと「Homeページ」「Helpページ」アクションを1つのコマンドでまとめて作成する。

コントローラ名をStaticPagesのようなキャメルケース(単語の頭文字を大文字にしてつなぎ合わせた名前)で登録すると、スネークケース(単語間にアンダースコアを加えて繋ぎ合わせた名前))の名前に変換してコントローラファイル(static_pages_controller.rb)が作成される。
*コントローラ名にスネークケースの名前を指定すると、そのままスネークケースの名前でコントローラファイルが作成される。

コントローラの作成に失敗(名前の記述ミスなど)し場合、コントローラ作成コマンドの「generate」部分を「destroy」にすることで、元に戻す(削除する)ことが可能。

*「generate」コマンでではたくさんのファイルが作成されるため、単にファイルを削除するだけでは、元に戻すことはできない
*コントローラ以外にも「generate」を使用する場合は、「destroy」で元に戻す(削除する)ことが可能。

作成したコントローラ、アクションをGitに登録

作成したコントローラ、アクションをGItに登録する。

以降はRailsチュートリアル上ではコミット、プッシュのタイミングは指示されないので任意のタイミングでコミット、プッシュを行う。

演習1

Fooというコントローラを生成し、その中にbarとbazアクションを追加する。

  • Fooコントローラ作成コマンド実行
  • config/routes.rb
  • app/controllers/foo_controller.rb
  • app/views/foo/bar.html.erb
  • app/views/foo/baz.html.erb

演習2

Fooコントローラとそれに関連するアクションを削除する。

  • Fooコントローラ削除コマンド実行
  • config/routes.rb
  • コントローラーとビューが削除されている

3.2.2 静的なページの調整

ビューの内容は静的なHTMLページなので、最悪Railsを知らなくても修正できる。

3.3 テストから始める

3.3.1 最初のテスト

テストコマンド「rails test」を使用してテストを実行する。

3.3.2 Red

「rails generate controller StaticPages home help」実行時に自動的に作成されているテストファイル(test/controllers/static_pages_controllertest.rb)に、まだ作成していないAboutページのテストを追加する。

 

テストコマンドを実行してテストが失敗することを確認する。

3.3.3 Green

3.3.2のテスト結果の「NameError: undefined local variable or method `static_pages_about_url’」からAboutページのURLが存在しないということがわかるので、ルーティングファイル(routes.rb)にAboutページのURLを追記する。

追記後、テストを再度実行。

変わらずエラーとなるが「aboutアクション」が存在しないというメッセージに変わる。

static_pagesコントローラーに「aboutアクション」を追加する。

そして、テストを再実行。

次はテンプレート(=ビュー)が存在しないというエラーになったので、ビューを追加する。

「app/views/static_pages」に「about.html.erb」というファイルを作成し、内容をRailsチュートリアルで指定されているものを記述。

そして、テストを実行。

やっとテスト成功。

コントローラー(アクション)を手動で作成する場合は最低限これだけのことをやる必要があるということ。

ブラウザでの動作も確認OK。

3.3.4 Refactor

これで安心してリファクタリングできるようになった。

3.4 少しだけ動的なページ

レイアウトによってページタイトルを変更するようにするが、学習しやすくするためにレイアウトファイルの名前を変えて無効化する。
(レイアウトファイルは「rails new」コマンドで「pp/views/layouts/application.html.erb」に自動的に作成されている)

*普通はこのようなことはしない

3.4.1 タイトルをテストする (Red)

特定のHTMLタグが存在するかチェックする「assert_selectメソッド」を使って、各ページに「title」タグの中に「ページ名 | Ruby on Rails Tutorial Sample App」という文字が存在するかチェックするテストを追加する。

テストを実行し、エラーとなることを確認。

3.4.2 タイトルを追加する (Green)

各ページのビューをRailsチュートリアルでの指示通りに修正(titleタグなどを追加)する。

テストを実行し、成功することを確認する。

演習1

テストファイルの冗長的な記述(「Ruby on Rails Tutorial Sample App」)をテスト前に実行される「setupメソッド」にまとめる。

3.4.3 レイアウトと埋め込みRuby (Refactor)

ERB(埋め込みRuby)を利用してコードを共通化する。

  • <%  %>で囲むと単に埋め込まれたRubyを実行するのみ
  • <%=  %>で囲むと埋め込まれたRubyの実行結果をHTMLに出力する
  • provideメソッドで「tilte」というシンボルに「Home」という文字列を関連つけている
  • yieldメソッドで「title」シンボルの値を出力している

テストを実行し、成功することを確認する。

同じように「help.html.erb」「about.html.erb」も修正、テストを実行し、成功することを確認する。

無効にしていたレイアウトファイルを元に戻す。

「app/views/layouts/application.html.erb」をビューのHTML構造(DOCTYPE、head、bodyなど)を共通化したものなので、各ビューページの「titleタグ」部分をコピーして、各ビューファイルの内容は「bodyタグ」の中だけの内容にする。

  • 「bodyタグ」内の<%= yield %>は各ビューファイルの内容が入る
  • <%= csrf_meta_tags %>はWeb攻撃手法の1つであるクロスサイトリクエストフォージェリー (Cross-Site Request Forgery: CSRF)を防ぐために使われるRailsのメソッド
  • <%= stylesheet_link_tag … %>は共通のスタイルシートを読み込んでいる
  • <%= javascript_include_tag “application”, … %>は共通のJavaScriptを読み込んでいる

3.4.4 ルーティングの設定

「config/routes.rb」にてhomeページをrootに設定する。

演習1

3.4.4で設定したルーティングのテストを行う。

演習2

3.4.4のルーティングの設定を削除して、テストがエラーとなることを確認する。

まとめ

ABOUT ME
Jyu2
ソフトウェア会社(SIer)で10年以上勤務のシステムエンジニア|ポケットWiFi使用歴2年以上|ポケットWiFi+αで快適でお得なインターネット環境を構築するための情報を発信|その他、IT情報やWebサービス、アプリ、ガジェットなどの情報を発信|自分と他の人のカバンの中身を紹介するメディア「カバンの中身ラボ(https://kaban-no-nakami-labo.com/)」も運営しています。 ポケットWiFi選びに迷ったらTwitter、お問合せフォームからご連絡ください。