見出し画像

【Rails】アクションをメタファーで理解してみる

Ruby on Railsを勉強中です。
今年2月に初めてプログラミングに触れ、Rubyに触れているレベルの初学者です。

RailsはMVCアーキテクチャと呼ばれる基本構造を持っていて、

  • Model

  • View

  • Controller

の3つの役割を持っています。

今回はMVC自体ではなく、その中にあるControllerに記述する「アクション」について、理解するときに使ったイメージ・メタファーの話をまとめていきます。

7つのアクション

基本となる7つのアクションは以下。

  1. index(一覧を表示)

  2. show(詳細を表示)

  3. new(新規作成)

  4. create(新規作成+保存)

  5. edit(更新)

  6. update(更新+保存)

  7. destroy(削除)

で、これを初めて見たときの僕はこう思いました。

「なぜ新規作成と更新が2個ずつあるんだろう?」

Rails初見ワイ

実際は、作っていくうちにジワジワわかってくるのですが、
最初に自分がどのようにイメージを掴んだのか、共有したいと思います。

newとcreate

まず、新規作成を行う「new」と「create」について。
たとえば「ブログ記事の投稿」を新しく行う際のコントローラーの記述は以下のようになります。

class ArticlesController < ApplicationController  

 def new
  @article = Article.new
 end

 def create
  @Article = Article.new(article_params)
  if @article.save
   redirect_to root_path
  else
   render :new, status: :unprocessable_entity
  end
 end
end


def 〇〇 で定義され、endで締め括られるまでが、そのコントローラーの挙動になります。

new というアクションは、Articleクラスの新しいインスタンスを生成するよ。という意味合いになります。

クラスとインスタンス

今思い出しても、クラス・インスタンスの概念はRubyを学習し始めて、最初の難関でした。

クラス・インスタンスのイメージは、

  • 「クラスとは、大きなルール」

  • 「インスタンスは、個別のモノ」

  • クラスは、
    「ブログ記事にはタイトルと本文、画像が載っている」
    という定義をするもの

  • インスタンスは、
    「今日のこの記事」
    という個別のモノを指す

みたいな感じ。

アクションを理解するには、インスタンスを「物体のイメージ」で捉えた方が良いと思います。
僕の感覚では、インスタンスは「箱」です。

箱のメタファーを使う理由

インスタンスには、いろんなモノを収納することができます。
たとえばブログ記事ならば、「画像」「タイトル」「本文」「書いた人」「アップした日」などの情報が収納されます。

もう一つのポイントは、「箱が最初につくられる」というイメージをしやすい点です。
つまり、ブログを書くときに実際に起こっていることは、
「本文を書いて、箱を用意して、入れる」のではなく、
「最初に空箱を用意して、そこに本文を入れる」のです。

この「空箱を用意する」作業に相当するのが、newアクションになります。

newアクションまとめ

  • newアクションは、「これからブログのデータを入れていくための空箱を作るよ」という動作にあたります。

  • Webアプリの動作(ユーザー体験)の面で言えば、「新規投稿ページにアクセスすること」がnewアクションとなります。

ではcreateは?

createは、新規作成したインスタンスに中身を詰めたあと、その箱をデータベースに保存する役割です。

イメージとしては、「中身がしっかり詰まったインスタンス(箱)を、特定の棚にしまうこと」です。

ブログの記事ならば、空っぽだったインスタンスに「タイトル」「本文」「画像」「書いた人」「書かれた日時」などの情報をギッシリ詰めこんだ状態にして、「記事」の棚に保存されます。
「記事」の棚に保存されたデータは、世界中から見ることができるブログ記事として表示されます。

これがcreateアクションであって、ユーザーから見ると「ブログを投稿する」というボタンをクリックする操作がこれに該当します。

箱には仕切りがある

ちなみにこの空箱には、いくつかの固い仕切りがあります。
たとえば、

  • 「ここには画像だけを入れてね」

  • 「ここには本文だけを入れてね。10000文字までね」

  • 「ここにはタイトルしか入らないよ。40文字までね」

といった具合です。
このように仕切りを設ける仕組みを「バリデーション」といいます。

createアクションまとめ

  • createアクションは、newアクションで用意された空箱に中身を詰めたあとで、それを保存する

  • ユーザーから見ると「記事を投稿する」ボタンが該当する

editとupdate

new/createと似た関係性をもつアクションとして、editとupdateがあります。

edit

editアクションは、「いちど棚に収納されたインスタンス(中身入り)を取り出してきて、編集させてくれる」イメージです。
ユーザー体験で言えば「記事を編集する」ボタンに該当します。

update

updateアクションは、「editアクションで取り出したインスタンスの中身を書き換えたあと、もう一度収納しなおしてくれる」ものになります。
ユーザー体験では「編集を確定する」ボタンが該当しますね。

index, show, destroy

これらは簡単なのでさくっと。

  • index ・・・棚に保存された箱をズラーっと眺めるイメージ
    (noteのトップで読みたい記事を探しているとき、あなたはindexを見ています)

  • show・・・棚に保存されている箱を1個選んで、中身を覗き込むイメージ
    (この記事を読んでいるあなたは今、記事の入ったインスタンスを覗き込んでいます)

  • destroy・・・箱ごとそのデータを破棄するイメージ

Railsのすごいところ

railsのすごいところの一つは、ヘルパーメソッド(便利ツールみたいなもの)が充実していて、例えば記事投稿画面のフォームなどを実装するform_withというヘルパーメソッドがあるところです。

form_withすごいよ

このform_withの挙動は、簡単に言えば以下のような感じ。

  1. 箱を受け取る

  2. 箱の中身に入れるデータをユーザに入力させる

  3. 入力されたデータを次に送信する

という機能です。
ですが、それだけではないんです。
なんとこのform_with先生、箱の中身を見るだけで、自分の仕事を把握してくれます。

どういうことかというと、

form_withの置いてある画面に対してnewアクションで遷移すると、
(つまり、ユーザーが「新規投稿」ボタンを押すと)、
それが「空箱である」ことを判断して、「create」アクションにその箱を送ってくれます。

一方、ユーザーが「編集」ボタンを押してeditアクション経由でform_withにインスタンスを渡したときは、それが「中身が入っている箱」であることを検知して、編集後はupdateアクションにインスタンスを送信してくれます。

驚くべきことに、この2つの挙動を見せるときの「form_with」の書き方(コード)は、全く同一のコードになっています。
すごい。

まとめ

Rails初学者の僕が、最初に7つのアクションを理解するときにイメージしたメタファーを共有してみました。
インスタンスは入れ物である、というイメージができると、一気に理解が進みましたので、個人的におすすめの方法です。

おしまい。

この記事が気に入ったらサポートをしてみませんか?