#背景
Railsでアプリケーションを作成する際に、疑問に感じたことが「ページのURLをカスタマイズすることはできないのか」ということでした。例えば、開発環境で新規投稿ページを作った場合、「localhost:3000/boards/new」などのように末尾に「new」というページ名になります。「new」でなければならないのか。「boards/new」ではなく「homes」などにすることはできないのか。この疑問からいくつかroutesについて分かったことがありますので、記事にしてみました。
#目次
- Routingとは
- 基本的なRoutingの書き方
- Routingは決まってるない!自由に指定できる!
- ControllerのAction名とViewのerbファイル名との関係について
- 終わりに
- 参考サイト
Routingとは
ウィキペディアで調べたらRoutingは以下のように書いてあります。
ルーティング(英: routing)あるいは経路制御(けいろせいぎょ)とは、データを目的地まで送信するために、コンピュータネットワーク上のデータ配送経路を決定する制御の事である。ネットワークのトポロジとトラフィック状態に関する情報を収集するためのプロトコルと、ネットワークを介したルートを設計するためのアルゴリズムで構成される。
難しく書かれていますが、Routingは単純に経路を意味します。Railsにおいて経路とは何かというと、例えば、ページをクリックしたら画面が表示されますが、このように画面に表示されるといった処理をどのようなURLアドレスに実現するのか、その道を指し示すことです。ユーザー登録ボタンをクリックしたら、ページの末尾に「/new」が付けられた形になっている。つまり、「URLの指定」と「表示される」が同時に行われる。これがRoutingなんです。
基本的なRoutingの書き方
Routingはconfigフォルダーのroutes.rbファイルに記述します。基本的な書き方は以下のようになります。
HTTPメソッド名 'ルート以下ページ名', to: 'コントローラー名#アクション名', as: 'prefix名'
※「as:'prefix名'」は省略することができます。その場合、prefixはrootになります。
# Routingは決まってない!自由に指定できる!
例えば、アプリケーションのindexページ(アプリ接続したら初めてみるページ)を表示するというケースはよくありますよね。その時はページの表示なのでHTTPメソッドはgetで以下のように書きます。
get '/tweets', to: 'tweets#index', as: 'tweets'
もしくは、
resources :tweets, only: :index
のように書いたりします。しかし、必ずこのように書かなければならないわけではありません。
極端な例をあげてみます。
①routes.rb
get '/patients', to: 'tweets#xxs'
これもcontrollerやcontrollerに対するメソッド名(=action名)、viewファイル名などがルーティングに書かれている内容と合致していれば何ら問題ありません。
最初の「'/patients'」はページに表示されるURL名になります。好きなように指定すればいいのであって決まってるわけではありません。次の「to: 'tweets#xxs'」ところが重要ですが「to: 'コントローラー名#アクション名'」をになっているので「tweets」は必ずコントローラー名と同じでなければなりません。また、「#xxs」についてですが、単純に「tweets」のコントローラーのメソッド名です。indexページであっても必ず「#index」にしなければならないということではありません。コントローラーで定義したメソッド名と一致すればいいだけです。用意すべきコントローラーは次のようになります。
②tweets_controller.rb
class TweetsController < ApplicationController
def xxs
@xxs = Tweet.all
end
end
コントローラー名はtweetsです。これはルーティングの'tweets'と同じです。また、defで定義したメソッド名は「xxs」であり、ルーティングの'xxs'と同じです。「to: 'tweets#xxs'」この部分なので確認してみてください。これがちゃんと機能するのかどうか、確かめるためにviewファイルを用意して表示してみましょう。
ControllerのAction名とViewのerbファイル名との関係について
その前に、controllerとviewについて知っておかなければならない点について説明します。それはcontrollerのAction名(メソッド)とViewのerbファイル名は同じということです。上の例をみてみるとtweetsコントローラーのxxsメソッド(action)がある場合、viewファイル名は「xxs.html.erb」にする必要があります。index機能のページだからと言ってindex.html.erbにしたらうまく表示されません。それはrailsではviewのファイル名を踏んだらcontrollerのアクションが発動するといった仕組みになっているからです。なので、viewのファイル名とcontrollerのアクション名が違うとrailsでは違うアクションを踏んだと認識してしまいます。また、viewファイルが格納されるフォルダ名はcontroller名と同じでなければなりません。
③xxs.html.erb
xxsだよ
<%= @xxs.ids %>
「@xxs.ids」の「.ids」メソッドはテーブルの全てのidを表示するメソッドです。
@xxsにはコントローラで @xxs = Tweet.allの記述によってTweetテーブルの全てのデータを取得し代入しています。
④Tweetテーブル(データベース)
idの2番から9番までデータが入っています。2〜9の数字が表示されるはず。
⑤表示された画面
railsを立ち上げ、「http://localhost:3000/patients」 に接続すると「xxsだよ」の後に配列として [2, 3, 4, 5, 6, 7, 8, 9]が表示されました。
終わりに
ページ名を好きに決めたいという気持ちでいろいろ試した結果、railsについて少しでも理解を深めることができました。疑問を持って学習を進めると今まで知らなかったことに気づくようになります。ただ単に教科書に書いてある内容を読むだけではそこに隠れている本当の内容が分からないかもしれないと思いました。
参考サイト
https://railsguides.jp/routing.html
https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0