【Ruby on Rails】RailsとHTTPの基本

Ruby on Railsを使っていよいよアプリケーションを作り始めます。そのうえで必要になる知識を学んで行きたいと思います。

HTTPの基礎知識

HTTP(HyperText Transfer Protocol)は、ブラウザとサーバーがHTMLや画像などの情報をやり取りすときに使われます。Railsにもガッツリ関わってくるので、HTTPの仕組みをある程度抑えておく必要があります!

リクエストとレスポンス

HTTPはとてもシンプルなプロトコルです。ブラウザがサーバーにリクエスト(要求)を贈り、サーバーはそれに答えてレスポンス(応答)を返します。

HTTP/1.1 200 OK
Date: Wed, 12 Jul 2017 09:50:41 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=UTF-8

レスポンスヘッダには、HTTPのバージョン、リクエストメソッド、ステータスコード、エンコーディングなどが表示されます。ほんとはもっと長いですが、ここでは簡略化して表示しています。

重要なポイントとしては、HTTPの通信は1つのリクエストに対して1つのレスポンスで完結するという点です。何度リクエストをしても、「前回と同じ人のリクエストかどうか」はわかりません。同じユーザーに対してのリクエストやユーザー専用のレスポンスを返したい場合は専用のしくみ(セッション)を作る場合は、サーバー側で工夫が必要となります。

URL

ブラウザは、アドレス欄のUTLを解釈してサーバーにリクエストを送ります。UTLはいくつかのパーツに分かれて構成されています。

パラメータをパスに含める

サーバ上のプログラムにパラメータを渡すには「?名前=値」のようにURLのクエリー部分に情報を入れるだけでなく、パラメータをパス部分に入れてしまうことも出来ます

http://localhost:3000/members/123

簡潔でわかりやすいURLは、Railsアプリケーションの特徴の一つです。Railsでは、こうした形式のパラメータも簡単に取り出すことができますよぉ!

GETとPOST

WebアプリケーションではGETやPOSTメソッドでのリクエストがよく使われます。アプリケーション内ではいずれの受け取り方でも様々なことが出来ますが、各メソッドごとに役割などがありますので、使用する場合はできる限りアプリケーションでの決め事などに合わせるようにしましょう。

メソッド機能
GETリソースの要求
POSTリソースの送信
HEADヘッダー部分だけを要求
PUTリソースの置換
PATCHリソースの一部更新
DELETEリソースの削除

リダイレクション

リダイレクションもよく使われる機能です。ブラウザが要求したURLとは別のURLを指定して再要求させるための仕組みです。よくページに飛んだけどさらに別のページに飛ばされるあれです。ベージが表示されるのとは別に、サーバーレスポンスのステータスコードが200以外となります。

その場合Locationに指定されているURLへリダイレクトを行います。

Railsのリクエスト処理の流れ

ブラウザからのリクエストを受けると、Railsはパスを調べ、routes.rbに従ってどのコントローラのアクションを実行するかを選択します。コントローラはたくさんあって、その中にアクションもたくさんあります。それらの組み合わせはroutes.rbに対応させたものを結びつけて起きましょう

Railsは選ばれたアクション(メソッド)を実行します。アクションには、モデルとの間で情報の遣り取りをするプログラムを書きます。モデルはデータベースのテーブルと対応しています。アクションはモデルから取得した呪法のうち、表示に必要なものをインスタンス変数に保存します。

アクションはブラウザへのレスポンスを作成するためにビュー(テンプレート)を選びます。特に指定しない限り、アクションと同名のテンプレートが選ばれます。

選ばれたテンプレートはコントローラのインスタンス変数を参照して、その値をHTMLソースの中に埋め込みます。この処理をレンダリングと呼びます。出来上がったHTML文書はコントローラによってブラウザに送り返され、画面に表示されます。

ルーティング

Railsでは、リクエストされたURLのパスから特定のコントローラとアクションを選ぶことをルーティングと呼びます。

アクションの追加

ルーティングの設定はconfig/routes.rbで行います。routes.rb自体もRubyのプログラムです。「Rails.application.routes.draw do 〜 end」の間に加えたコードがルーティングの設定になります。

TopControllerにaboutアクションを追加する場合は以下のように修正。

Rails.application.routes.draw do
	root "top#index"
	get "about" => "top#about" , as: "about"
end
class TopController < ApplicationController
  def index
  	@message = "indexアクションが呼ばれた"
  end
  def about
  end
end

aboutアクションのテンプレートは[app/views/top/about.html.erb]になります。


いちいちroutesファイルを修正しなきゃいけないのがちょっと面倒かな?とか思ったけど、不正なアクセスするパターンを一望できる仕組みはとても便利だと思いました。

ルーティングエラー

ルーティングの設定に当てはまらないパスをブラウザで開こうとすると、ルーティングエラーが発生します。ブラウザに「http://localhost:3000/foo/bar」のように存在しないページを指定するとエラーページにリダイレクトされます。

この手のエラーは以下の場合に該当すると発生します

  • ルーティングの設定をしていない場合。
  • HTTPメソッドが合わない。POST歯科受け付けないアクションにGETでアクセスしようとしたときなど。
  • app/assetsやpublicの下に存在しないファイルにアクセスしようとしたとき。

このエラー画面を「Not Found」のような自分のエラーページに変える方法は別途説明をしたいと思います>現在準備中