【Rails】アクションをメタファーで理解してみる
Ruby on Railsを勉強中です。
今年2月に初めてプログラミングに触れ、Rubyに触れているレベルの初学者です。
RailsはMVCアーキテクチャと呼ばれる基本構造を持っていて、
Model
View
Controller
の3つの役割を持っています。
今回はMVC自体ではなく、その中にあるControllerに記述する「アクション」について、理解するときに使ったイメージ・メタファーの話をまとめていきます。
7つのアクション
基本となる7つのアクションは以下。
index(一覧を表示)
show(詳細を表示)
new(新規作成)
create(新規作成+保存)
edit(更新)
update(更新+保存)
destroy(削除)
で、これを初めて見たときの僕はこう思いました。
実際は、作っていくうちにジワジワわかってくるのですが、
最初に自分がどのようにイメージを掴んだのか、共有したいと思います。
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の挙動は、簡単に言えば以下のような感じ。
箱を受け取る
箱の中身に入れるデータをユーザに入力させる
入力されたデータを次に送信する
という機能です。
ですが、それだけではないんです。
なんとこのform_with先生、箱の中身を見るだけで、自分の仕事を把握してくれます。
どういうことかというと、
form_withの置いてある画面に対してnewアクションで遷移すると、
(つまり、ユーザーが「新規投稿」ボタンを押すと)、
それが「空箱である」ことを判断して、「create」アクションにその箱を送ってくれます。
一方、ユーザーが「編集」ボタンを押してeditアクション経由でform_withにインスタンスを渡したときは、それが「中身が入っている箱」であることを検知して、編集後はupdateアクションにインスタンスを送信してくれます。
驚くべきことに、この2つの挙動を見せるときの「form_with」の書き方(コード)は、全く同一のコードになっています。
すごい。
まとめ
Rails初学者の僕が、最初に7つのアクションを理解するときにイメージしたメタファーを共有してみました。
インスタンスは入れ物である、というイメージができると、一気に理解が進みましたので、個人的におすすめの方法です。
おしまい。
この記事が気に入ったらサポートをしてみませんか?