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 メソッドも用意してください。
  • メソッドの並びは何でも良いですが【 newcreate 】、【 editupdate 】のセットがわかりやすいように並べています。
  • この【 CRUD用のメソッド 】と【 ビュー用のメソッド 】の違いがわかりにくいのですが、基本的に
    • CRUD用のメソッド 】→【 データベースを追加(更新)】をするため
    • ビュー用のメソッド 】→【 ビューの表示に関する処理 】をするため
      • ​というの違いがあります。

CRUD(クラッド)

次回に続く

  • ここから本格的にCRUDを実装していきますので、一旦終わっておきます。お疲れ様です。
  • 次回以降、CRUDをすべて実装していきたいと思います。