Railsチュートリアル(第4版)第3章: 学習記録

今日は第三章から。第三章からはtwitterのコピーアプリを作っていくところですね。1周目の反省として、特にテストを全く理解せずにコピペしたこと、HTMLなど表面のファイルも基本的には頭使って考えなかったことです。ですので、二周目は時間がかかってもこの辺のコードもしっかり理解して行きたいですね。

まずはコントローラについての説明から。「コントローラとは(基本的に動的な)webページを束ねるコンテナ」のようなものらしいです。コントローラって二章でも触れたように各アクション(ページの動きやデータベースとのやりとり)が定義されていて、そのアクションの最後にhtmlのビューを呼び出すというものでした。動きを定義し、僕らがみている表面を生成しているのもコントローラだ、というところから「webページを束ねるコンテナ」という表現になっているのでしょう。

前の章でもやったように、マスター上でずっと作業しているのは、間違いを直したりする効率を考えてもよろしくないので、ブランチを作ってトピックごと(今回であれば静的なページを作るトピック)に作業をして、終わるごとにマージするのが良さげですね。実際にやってみます。

続いてコントローラを生成していきます。今回は静的ページを作るだけなのでstatic pagesコントローラを作ります。表記はStaticPagesにしています。この際にアクション名も指定することで、コントローラ内に自動でアクション名を記述、更に関連するhtml.erbファイルも自動生成してくれます。rails賢い。。今回はhomeページ、helpページ、aboutページの3つを作りたいのですが、学習のために(確か自分でコントローラ内にアクションを記述して、自分でhtml.erbファイルを作ってみるトレーニングのため)homeとhelpだけを指定します。

今回ここで一旦ブランチをgithubの方にpushしているのですがここでも気づいたことが一つありました。今回pushしてるのって全体ではなく、仮のトピックブランチだけなんですね。githubを確認してみると「ブランチ」という項目があります。この中をみてみるとmasterとstatic-pagesの二つがあり、masterの方にはまだ変更がpushされておらず、static-pagesの方にだけpushされていました。この章の最後までやって、最後にmasterにトピックをマージしてから初めてmasterの方に変更が反映されるんですね。便利だあ。

また、コントローラを生成した際にroutes.rbファイルの中に自動でルーティングも設定されました。みてみると二つあり、get “staticpages/home”とget “staticpages/help”がありますね。意味としてはstaticpagesコントローラのhelpアクションですよという感じです。ここでgetってどういう意味なんでしょうか?二章でも軽く出てきましたが、これはhttpの4つの動作、get/post/patch/deleteのうちの一つです。ブラウザとサーバーはどちらもこの4つの動きを認識できます。getは主にweb上のデータを読み取る時に使われます。postはフォームに入力した値を送信したい時に、patchとdeleteは何かを更新したり削除したりする時に用います。

さて、ここでstaticpagesコントローラをみてみると二つのメソッドが記述されています。homeとhelpがあります。ただ今回この中にはまだ何も書かれていません。一方で、classの右側をみてみると”staticpages_controller < applicationcontroller”と書かれていますね。これは前回も登場した継承で、この継承のおかげで、中身が記述されていなくてもこれらのメソッドはrailsらしい動きをします。今回の場合、urlが送られるとstatic_pagesコントローラのhomeアクションを参照し、その中身のコードを実行した後にそのアクションに対応するビュー”home.html.erb”を出力します。

次はいよいよテストに入ります・・・。前回きつかったところだ。aboutページを新たに作るに当たってのテストだそう。何かを新しく実装する時には必ずテストをしっかり書いてから、という癖つけのためのようです。まあ色々と書いてあるのですが、まとめると「まずはとっつきやすいコントローラテスト」からやってみようということです。流れとしては、テストを書いて間違いが起こることを確認し、その間違いを潰すような流れでコードを書いていきます。これ、progateで学習していた時には気づかなかったのですが、コントローラを作成した時に自動でコントローラテストも生成してくれていたんですね。つくづく面倒見の良いrails。。言葉で表すと以下がわかりやすいですね。「homeページのテスト、getリクエストをhomeアクションに送信したらそのレスポンスは成功するはず」ってな意味だそう。

コードの意味を完全に理解したわけではないのですがhome, helpのテストを見ればaboutのテストもかけそうです。書いてテストを実行して返ってきたのがこちら。’undefined local variable or method `static_pages_about_url’。つまり、static_pagesのaboutへのurlが見つかりませんよ、ってこと。ということでroutes.rbにルーティングを追加。ルーティングを追加してもう一度テストを実行して返ってきたのがこちら。”ActionNotFound: The action ‘about’ could not be found for StaticPagesController”。つまり、aboutアクションがコントローラで見つかりませんでした、とのことなので、aboutアクションをコントローラに追加。ここでまたテストを実行してみると、”StaticPagesController#about is missing a template for this request format and variant.”。つまり、テンプレート(ビュー)=アクションビューが見つかりませんよ、ということみたい。てことでビューを追加。

ここでテストをすると成功しました。

続いて動的なページを作っていきます。「<ページ名> | Ruby on Rails Tutorial Sample App」というように、home, about, helpのそれぞれでtitleの表示が変わるように、テストからまた作っていきます。テストでは以下のようなコードを記述します。

assert_selectでは特定のhtmlタグが含まれているかどうかをテストできます。ここではtitleタグの中にhome|…..が含まれていますか?ということをテストしていることになります。テストはもちろん失敗します。この後、タイトルを追加していきますが、この際はまだ静的な状態ですね。

次にerbの説明をしているんですが、progateをやっていた時にも疑問になっていたyieldの役割について。application.html.erbのbodyタグの中には<%= yield %>というものがありますね。これはurlにアクセスし、home.html.erbがhtmlに変換されると、その後yieldに変換され、application.html.erbを通じて実際に僕らがみているビューになるということみたいです。

無事、githubへのpushも済んだので、これで三章目の二周目終わりです。学んだことが多かったです。少し疲れました。笑

シェアする

  • このエントリーをはてなブックマークに追加

フォローする