🍋

Rails ルーティングについて

2023/05/14に公開

はじめに

チーム開発でアプリケーション詳細設計書を作る前にいろいろと予習復習中の初心者です🔰

今までやってきたことはなんだったのかってくらい自分の理解ができてないところがたくさん目について凹んでますが、逆に成長できるチャンスやと自分に言い聞かせています🏋🏻

今までURLやHTTPについてあまり意識できていなかったので、
私なりになぜ?と思ったことを書き残しておきます。

HTTPリクエストについて

ブラウザは表示したい(取得したい)ページを表示するために、欲しいページやデータを持っているサーバーに対してお願いするような形でリクエストをする必要がある。
(このお願いがHTTPリクエスト)

HTTPリクエストには以下のようにいくつかの種類があり、それぞれをリクエストメソッドと呼んでおり、省略してメソッドとだけ呼ばれることもある。

HTTP 用途
GET データの取得(ページ自体もデータ)
POST 新しいデータの作成
PUT 既存のデータの更新
PATCH 既存のデータの一部更新
DELETE 既存のデータを削除

💡じゃあ、newアクションの時はPOSTなのでは?と思ったのですが、その時は実際にデータが生成されるのではなく、ユーザーからデータを入力するためのフォームを提供するため、GETメソッドが使用されるとのこと!💡

簡単にいうと、

newアクションは、

「投稿を新規作成するためのフォーム(書き込むところ)をviewに返すアクション」

createアクションは、

「投稿を新規作成するアクション」

です。

💡補足

例えば、「新規投稿作成」ページに移動した場合、このページはユーザーから投稿タイトル、内容などの情報を入力するためのフォームを提供する。サーバーにはまだ新しい投稿が生成されていないので、「新規投稿」ページを要求するためにGETメソッドが使用される!

その後、フォームに情報を入力し「送信」ボタンをクリックすると、サーバーに新しい投稿を作成するよう要求され、このときはPOSTメソッドが使用される。(このPOSTリクエストにはユーザーがフォームに入力した投稿タイトル、内容などの情報が含まれている)

このようにウェブ開発ではリソースを生成する過程が、'new'アクションと'create'アクションに分かれていて、この二つのアクションはそれぞれGETとPOSTメソッドを使う。

editアクションの時も同じ原理で、'edit'アクションは既存のリソースの編集フォームにアクセスするためのURLを提供し、ユーザーがデータを入力して編集を行うためにGETリクエストを使用する。編集フォームの送信や変更の保存は、通常、更新操作に適したPOSTリクエストやPUT/PATCHリクエストを使用して行われる。

💡なるほど。じゃあnewがあるとこにcreateがないとおかしいし、editがあればupdateもないとおかしい。ちゃんとカリキュラムを理解しきれていれば問題なかったところだと思うが、現役のエンジニアの方もここなんでGETなの?って言ってたので、自分なりに調べて理解できてよかった!💡

https://ymiyashitablog.com/rails-new-create-2/

🌱フォームヘルパーについて
https://railsguides.jp/form_helpers.html

ちなみに、省略されていない形はこれ!

<%= form_with model: @list, url: '/lists', method: :post do |f| %>
:

urlとmethodオプションを使用することで、どのURLへどのHTTPメソッドで送信するかを厳密に指定することができる!

railsで定義されている7つのアクション

アクション名 役割
index リソースの一覧を表示する
new リソースを新規作成する
create リソースを新規作成して追加(保存)する
edit リソースを更新するためのフォームを作成する
show レコードの内容を表示する
update リソースを更新する
destroy リソースを削除する

一般的には7つの基本アクションを用いて設計するが、それだけでは対応できない要件がある場合やコードの可読性や保守性を高めるために、追加のアクションを作成することがある!

が、不必要に多くのカスタムアクションを作成すると、アプリケーションの設計が複雑になるので注意。

追加のアクションを作りたい場合

collectionとmember

7つの基本アクション以外でルーティングを定義する時には、collectionかmemberを利用!

  • collectionはルーティングに:idがつかない(リソースの集合全体を対象)
  • memberは:idがつく(リソースの集合の中の特定の1つのリソースを対象)
    という違いがあります。

collection

resources :users do
  collection do
    get 'download'  #/users/download というURLになります。
  end
end

member

resources :users do
  member do
    get 'activate'  #/users/:id/activate というURLになります。
  end
end

collectionとmemberを使用することで、RESTfulな設計を維持しつつ、アプリケーションの要件に応じたカスタムアクションを追加することが可能!

https://qiita.com/morikuma709/items/5b21e9853c9d6ea70295

https://pikawaka.com/rails/resources

https://teratail.com/questions/20276

https://railsguides.jp/routing.html

https://railsdoc.com/page/resources

お疲れさまでした🌙

Discussion