Ruby on Railsでブログ作成(2) - Route,Controller,Viewの流れを知る

プログラミング、サーバー、ネットワーク、IT用語、ハマったときのトラブルシューティングなど様々なIT関連の話題をひたすら書いていく技術ブログです。

2017年2月10日金曜日

Ruby on Railsでブログ作成(2) - Route,Controller,Viewの流れを知る


では、MVCをざっくり理解したところで、ブログを作成していきましょう。と言っても、少しRailsの基本の話になります。説明はcloud9でRail環境を作って説明します。cloud9は無料で使用できるオンラインのIDEです。Rails以外にも様々なプログラミング言語に対応しています。cloud9はこちらから登録して使用できます。

route.rbでURLのパターンとcontrollerを紐付ける

まずRailsでWEBrickを立ち上げて表示してみると下記のようになっていると思います。


そしてURLに「http://your_domain/pages/home」と入れてみましょう。your_domainは読者の方の環境のdomainに入れ替えて下さい。するとこうなります。


Routing Errorとでていますね。これは「リクエストしたURL(上記)が前回説明したrouteの設定にないですよ」というエラーです。一旦コンソールを開いて現在どのようなrouteが設定されているか確認してみましょう。cloud9であれば画面下の方にあるコンソールから、Macであればコンソールを、WindowsであればTeraTermなどを開いてこのようにコマンドを実行します。

rake routes

このコマンドは現在config/route.rbに設定してあるURLパターンとcontrollerの紐付けを確認する非常に大切なコマンドです。すると下記のようなエラーが出ると思います。

You don't have any routes defined!
Please add some routes in config/routes.rb.
For more information about routes, see the Rails guide: http://guides.rubyonrails.org/routing.html.

これはrouteが何も設定されていないから設定を書いて下さいと言っています。まだ何もしていないので、こうなるのも分かりますね。ではroute.rbを設定してみましょう。下記の設定をroute.rbのどこかに設定してみましょう。

get 'pages/home', to: 'pages#home'

何となく想像は付くと思いますが、get(httpのメソッド)でpages/homeにアクセスしたときはpagesコントローラーのhomeアクションに行きなさいということになります。アクションとはメソッドです。RailsではControllerの中のメソッドのみアクションと呼んでいます。そして保存した後、再度rake routesをしてみましょう。下記のように表示されます。

Prefix Verb URI Pattern Controller#Action
pages_home GET /pages/home(.:format) pages#home

インデントがずれていて分かりづらいので、表にします。
項目
Prefix pages_home
Verb GET
URI Pattern /pages/home(.:format)
Controller#Action pages#home

細かいところはゆくゆく説明するとして、再度先ほどRoute Errorになったページを再読み込みしてみましょう。するとエラーが変わるはずです。今度はPagesControllerがありませんとなります。


ここで下記の図で状況を確認しましょう。


これまでのところで、ユーザーのリクエストをrouteが判定してcontrollerに処理を渡すところまで実装しました。ですので、次はcontrollerを作成します。app/controllerフォルダの直下にpages_controller.rbファイルを作成してください。Railsではファイル名をxxx_contorller.rbとなるようにアンダースコアで繋げます。これをスネークケースと呼びます。そして中身のclass名というはこのように書きます。

class PagesController < ApplicationController end Railsのクラス名(PagesController)は単語の先頭文字を大文字にするキャメルケースを使用します。「<」は継承です。PagesControllerはApplicationControllerクラスを継承しています。そしてクラスの最後はendで閉じます。ここでリロードを行うとエラーが変わるはずです。

homeアクションがPagesContorllerクラスにありませんと書かれています。では、PagesContorllerにhomeアクションを実装します。下記のようになります。因みにRailsのインデントはタブ(4文字)ではなく空白2文字です。

class PagesController < ApplicationController def home end end 再度リロードします。するとhomeアクションの処理が終わり、自動的にviewを呼び出そうとします。そこでmissing templateというエラーが起きます。


templateとはHTMLのことです。では、HTMLの置き場所は基本viewsなので、viewsの直下にpagesフォルダを作成してhome.html.erbを作成して下さい。そしてhome.html.rbにh1で「ここはホーム画面です。」と実装して下さい。このフォルダ/ファイル構成や命名規則は大事でcontorller側に合わせます。PagesContorllerのhomeアクションからviewを呼び出しているので、Railsはviewsの配下のpagesフォルダを探しにいきます。そしてhomeアクションなのでhome.html.rbを探しにいきます。テンプレートが見つかったのでh1で「ここはホーム画面です。」と表示されていると思います。

これで画面表示することができました。

◯「Ruby on Railsでブログ作成(3)」の記事はこちら
◯「Ruby on Railsでブログ作成」シリーズの記事一覧はこちら



最近の投稿