1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Ruby on Railsフレームワークの設計構造をMVCマインドで理解する

2022-01-04 20:59:16

railsでは、リクエスト(/users)を送信するまでの全工程は以下のようになります。
1) ブラウザがリクエスト(/users)を送信する
2), Rails routesはusers_controllerのindexメソッドにリクエストをルーティングします。
3), users_controller は User Model にコールバックし、すべてのユーザーを取得します。
4), User Model はデータベースからすべてのユーザーを読み出します。
5) User Model はデータベースから読み込んだすべてのユーザーを List にラップし、user_controller に返します。
6), user_controlle は User Model から返されたユーザーリストをインスタンス変数 @users に代入し、それをインデックスビューに渡します。
7), インデックスビューは渡された@usersを受け取り、埋め込まれたrubyを通してHTMLとしてレンダリングします。
8), user_controller はレンダリングされたページをブラウザに返します。

ルーティング戦略、つまり別のコントローラやコントローラの別のメソッドを呼び出すこと以外は、リクエスト間で基本的に同じ処理が行われます。正確な呼び出し戦略はRailsルータが決定します。

Railsルーター
RailsのResourcesのルーティングポリシーは、URLはリソースの位置特定を担当するだけで、リソースの操作はネイティブのHTTPメソッドタイプで決定するというRESTデザインスタイルに準拠しており、routes.rbでresources :usersを設定するだけで、以下のように一連のルーティングポリシーが得られるようになっています。

HTTP request URI Action Purpose 
GET /users index page to list all users 
GET /users/1 show page to show user with id 1 
GET /users/new new page to make a new user 
POST /users create create a new user 
GET /users/1/edit edit page to edit user with id 1 
PUT /users/1 update update user with id 1 
DELETE /users/1 destroy delete user with id 1 


もちろん、RailsはさまざまなRESTスタイルのルートに加えて、routes.rbに以下の記述を追加することでさまざまなカスタムルートルールもサポートしています。

match 'user/create' => 'users#new', :via => :get 


このルールはブラウザのbrowse/user/createにマッチし、Railsはusers_controllerのnewメソッドにリクエストをルーティングし、それ以外は/users/newと同じように処理します。ただし、Railsは最初にマッチしたルールを使用するので、上のルートステートメントを次のように変更すると、そのルールが使用されることになります。

match 'users/create' => 'users#new', :via => :get 


もし、ルールにマッチさせたいのであれば、私たちが考えているようにはいきません、ルールにマッチします

GET /users/1 show page to show user with id 1


つまり、idが作成されたユーザーを取得します。