Ruby on Rails
入門4
これから
- 次の目標を再度確認しておきましょう。
- showページに表示される内容を切り替えて、すべての本の詳しい情報を見れるようにする という事をやっていくんでしたね。
- つまり、以下のイメージです。

サイトを使う人

①"ザリガニの冒険"の
show を見せて!

②"ザリガニの冒険"の
レコードが必要だ!
モデル
コントローラー
データベース
③はいよ
④"ザリガニの冒険"の
データでHTMLを作って!

ビュー
⑤はーい
⑥どうぞ!
データの指定
これだと場所を指定しているだけ。
どのデータを表示すれば良いかわからない。
さらにデータの指定が必要
/データの指定
- ここで重要になるのが URL です。
- 今まで【〜books/show】にアクセスすると、単純にshowページが開きました。
- 今回は【〜books/show】にアクセスされた時に、ただページを表示させるだけでなく、【どのデータ(レコード)を表示させるかの指定】をしなければいけません。
- つまりURLに ページの場所の指定 だけではなく、データの指定もさせなければいけないという事です。
- 実はURLは ページの場所の指定 ではなく、それ以外の情報(パラメータ)を引っ付けることによって、 データの指定 をすることも出来ます。
データの指定
データの指定の例
これが【データの指定】
- 実はほとんどのWEBアプリケーションが、このような仕組みを使っています。
- 特に有名なものとしてwikipedia(ウィキペディア)です。
- 試しにwikipediaで何か調べものをしてみましょう。→リンク
-
この時URLに注目して見てみると、下の感じになっていますね。
- (例:エリンギのページの場合)
- 【 エリンギ.html 】なんてファイルが用意されているわけがありませんので【 https://ja.wikipedia.org/wiki/という場所への指定 】と【"エリンギ"というのデータの指定(パラメータ)】が入っているのです。
- 他にも「 https://ja.wikipedia.org/wiki/エノキ 」にするとエノキのページが、「 https://ja.wikipedia.org/wiki/しいたけ 」なら、しいたけのページが開くようになっています。
データの指定の例
- じゃあ自分のサイトでも同じようになるか、試してみましょう。
- 自分の本のタイトルをURLの最後につけてください。
- これでアクセスしてみると、、、当然エラーになります。
- Routing Error(ルーティング エラー)というエラーが表示されましたね。
- これは「このURLって、どこのコントローラーの、どのアクションメソッドで処理すんの?」って状態なんです。
- つまり「行先(ルート)がわからない」状態なので、ルーティングエラーです。
- では次は、このURLに対応した「ルート」を作ってあげましょう。
- ルートは「 config/routes.rb 」というファイルで設定します。
ルーティング
- これが現在のルートです。
- ここに新しいルートを追加してあげます。
- 次のページへ。
- 【 get 'books/index' 】とか【 get 'books/show' 】とか見慣れないコードが書かれています。
-
これは「get」という「HTTPメソッド」で、「 'books/index' 」というURLにアクセスがあったとき…、という意味になっています。
- (「HTTPメソッド」に関しては、今は気にしないでください。後の方で説明します)
- 「URLにアクセスがあったとき…」って、その続きは???って思いますが、実はこれが書かれていません。省略されています。
- では、省略せずにちゃんと全部書いてみましょう。以下のようになります。
ルーティング
- 矢印みたいな「 => 」という記号と、「 'books#index' 」(真ん中が / じゃなく # になっている)が追加される形です。
- 次へ。
- 元々ある左側の【 'books/index' 】がURLのことで、追加した右側の「 'books#index' 」が「コントローラー#メソッド」を表しています。
- つまり【 get 'books/index' => 'books#index' 】は「 books/index というURLにアクセスがあった場合は bookコントローラー の indexメソッド を実行する 」という意味になります。
ルーティング
- 同じように【 get 'books/show' => 'books#show' 】は「 books/index というURLにアクセスがあった場合は bookコントローラー の indexメソッド を実行する 」という意味になります。
- これが、今現在のルートファイルの設定です。次へ。
コントローラー#メソッド
URL
- さて、この設定を下のようにイジります。
- ※indexの方はそのままで良いので、元に戻しています。
ルーティング
- 【 get 'books/show' 】を【 get 'books/show/:name' 】に変更していますね。
- このように書くことで、【 books/show/データの指定(パラメータ)】というように「データの指定」がついたURLを【 booksコントローラーのshowメソッド 】へ流すルートが出来ます。
- routesファイルの設定はこれだけOKです。
- ちなみに、この時点で【 get 'books/show' 】(データがない状態のURL)のルートが無くなりましたので、今までのように【 〜books/show 】とするとルーティングエラーになります。
- データがない状態の showページ は意味がないのでコレでOKです。
- じゃあ試してみましょう。
- まずは「データの指定があるURL」を開いてみると、ちゃんと開くようになっています。※画像①
- 逆に「 ~books/show 」だけだとエラーですね。※画像②
ルーティング
①
②
- ただ、まだ問題があります。
- 先ほどの「データの指定」を別の本に変えてみてください。
- 別の本を指定しても、結局同じ本のデータが表示されると思います。※画像①
- つまり、今は「どんなデータでも、同じ本を表示する」という状態です。
- なんなら、登録してない本の名前を指定しても、同じ本が表示されます。※画像②
- そう、今は【 データの指定(パラメータ)さえあれば何でも良い 】状態です。
- 本当は【 正しいパラメータかを判断し 】【 そのパラメータのデータを表示する 】という設定が必要です。
- ルーティングはあくまで「URLと、対応するメソッド」を指定するものなので、後の処理はコントローラーで作ります。
- 次へ。
ルーティング
①
②
- 「 app/controllers/books_controller.rb 」の showメソッド を以下のように変更しましょう。
コントローラー
- 簡単に説明すると「 params[:name] 」が「URLの末尾につけたパラメータ」です。
- もしURLに「 ~books/show/ザリガニVS伊勢エビ 」としたとすると、「 params[:name] 」は「"ザリガニVS伊勢エビ"」になります。
- params(パラムズ)とは、パラメータのことで「ハッシュ」と呼ばれる形式で、指定したパラメータが保存されています。(ハッシュについては後で)
- params[:パラメータ名] で、パラメータを指定できるのですが、今回は「 :name 」となっていますね。
- ちなみに、このパラメータ名の name は、先ほどのルーティング設定の「 get 'books/show/:name' => 'books#show' 」の部分で設定しています。次へ。
- では実際に試してみましょう。登録している本のタイトルをパラメータにして、表示させてください。
- ※存在しない本の名前を指定するとエラーになります。
コントローラー
- 今は【 name 】カラムのパラメータを渡していますが、もちろん他のカラムで、パラメータを指定することも可能です。
- 単純に name の部分を変えるだけですので、試しに【 id 】カラムのパラメータに変更してみましょう。
- ※ idカラム は自分では追加していませんが、必ず勝手に追加されるカラムです。
- 変更するには、ルーティング側で「パラメータ名の変更」と、コントローラー側で「検索するカラムの変更」が必要ですね。
- 以下のようにそれぞれのファイルを変更してください。
別カラムでの指定
routes.rbファイル
book_controller.rbファイル
- これで、id で指定できるようになりました。
- id はテーブルにデータを保存した順番で、自動的に割り振られる番号です。
- 今は 1 から 3 までの本が登録されていると思うので、id を指定して表示させてみましょう。
- 尚、id で指定する方法に変えたので、もう名前で指定しても、表示されません。
別カラムでの指定
- ちゃんと表示されましたか?もしエラーになる場合は、スライドを見返して確認してください。
- また、id で指定した方が簡単なので、このままパラメータは id を使うことにして進めます。
ハッシュ
- では、先ほど使った params について少し説明しておきます。
- これはハッシュと呼ばれるデータ形式になっていますが、このハッシュは別のプログラミング言語などでは「辞書型」と呼ばれる形式です。
- このハッシュは、基本的には配列の仲間で、複数の値を保存できるようになっています。
- 配列との違いとしては配列が「インデックス番号と、値が紐づく」のに対し、ハッシュは「キーと、値が紐づく」という点です。
- キーは、文字や数字など、何でも良く、自由に決めることが出来ます。
- 「name: "キノコード"」のようにすると[:name]というキーと、"キノコード"という文字が紐づくので、「:name」と書くだけで、"キノコード"という意味になります。
- ハッシュは本来は「 abc = {"name" => "kinoco" } 」みたいに作るのですが、Railsでは、自動で params というハッシュが用意されており、パラメータを受け渡すために使われる、ということです。
配列(番号で指定する)
ハッシュ(キーで指定する)
[0]
[1]
[2]
[3]
[4]
[:id]
[:name]
[:age]
[:100]
[:あ]
- さて、ちょっとここらで一旦休憩し、今までの内容を振り返ってみましょう。
- 最初に ビュー や コントローラー をイジッて、表示する内容をかえてみました。
- その後、モデル を作り、データベースにデータを保存しました。
- さらに、ルーティング設定で、URLにパラメータを引っ付けられるようにし、それを使って、1つのファイル(showページ)なのに、様々な本の内容を表示させることが出来るようになりました。
- サイトとしても多少形になってきました。
- では、このサイトを完成させるには、あとどんな機能が必要でしょうか?それを考えてみましょう。次へ。
現状確認
- じつは、アプリケーションやシステムには【 必ずあるべき基本機能 】というのがあります。それは、
- Create(クリエイト:登録)
- Read(リード:参照)
- Update(アップデート:更新)
- Delete(デリート:削除)
-
この4つです。
- コレを略して【CRUD(クラッド)】と呼びます。
- これを今回のサイトに当てはめてみましょう。
- Create(クリエイト:登録)→ 新しい本を追加出来るようにする ※まだない機能
- Read(リード:参照)→ 本の内容を見るページ ※すでにある機能(showページのこと)
- Update(アップデート:更新)→ 本の内容を編集できるようにする ※まだない機能
-
Delete(デリート:削除)→ 本を削除出来るようにする ※まだない機能
- となりますね。
-
つまり現在は Read しかないので、残りを作っていけば、一人前?のりっぱなサイトになるという事です。
- 次に続く。
現状確認
- Railsでは、このCRUD(クラッド)に対応したメソッド(アクションメソッド)が用意されています。
- Create(クリエイト:登録)→ createメソッド
- Read(リード:参照)→ showメソッド
- Update(アップデート:更新)→ updateメソッド
-
Delete(デリート:削除)→ destroy(デストロイ)メソッド
- だいたいそのまんまの名前ですね。(Delete以外)
- では、まずは足りないアクションをコントローラーに設定しちゃいましょう。
- 右のようにしてください。
CRUD(クラッド)
- 次はビューです。
- ビュー(表示する画面)を追加しないといけないのは、
- create → 新しい本を登録する画面が必要
-
update → 本の内容を編集できる画面が必要
- の2つだけです。
-
delete に関しては、本を削除する画面 は、なくても良いので作りません。
- ※編集画面(update)に削除ボタンを置いておけば良いので。
- このように、必ずしもアクションごとの画面が必要なわけではありません。
CRUD(クラッド)
- では、
- 【新しい本を登録する画面】(Create)
- 【本の内容を編集できる画面】(Update)
- のファイルを用意しましょう。
- ビューファイルに関しては、コマンドではなく、普通に作成します。
- ただ、Railsではアクションメソッドごとに、それぞれのファイル名にもルールがありますので、必ず以下のファイル名で作ります。
- Createメソッド → new.html.erb
- Updateメソッド → edit.html.erb
- ファイル作成は【 app/view/books 】フォルダを右クリックして、【Add file】を選択すればOKです。※画像①
-
new.html.erb と edit.html.erb を作成してください。
- ※画像②の状態になればOKです。
CRUD(クラッド)
右クリック
①
②
- さらに、このview用のアクションメソッドも用意しておきましょう。
- もう一度コントローラーを開いて、new と edit メソッドも用意してください。
- メソッドの並びは何でも良いですが【 newとcreate 】、【 editとupdate 】のセットがわかりやすいように並べています。
- この【 CRUD用のメソッド 】と【 ビュー用のメソッド 】の違いがわかりにくいのですが、基本的に
- 【 CRUD用のメソッド 】→【 データベースを追加(更新)】をするため
-
【 ビュー用のメソッド 】→【 ビューの表示に関する処理 】をするため
- というの違いがあります。
CRUD(クラッド)

次回に続く
- ここから本格的にCRUDを実装していきますので、一旦終わっておきます。お疲れ様です。
- 次回以降、CRUDをすべて実装していきたいと思います。
Ruby on Rails入門4
By kinocode
Ruby on Rails入門4
- 1,400