MVC(Model-View-Controller)とは
ソフトウェア開発における重要なアーキテクチャパターンの一つです。特に、ウェブアプリケーションの開発において広く使用されています。MVCは、アプリケーションのコードを機能的に分割し、保守性と拡張性を向上させるための設計原則を提供します
Model(モデル)
モデルはアプリケーションのデータとビジネスロジックを扱います。データベースから情報を取得したり、データの操作(追加、削除、更新)を行ったりします。例えば、ブログの場合は、投稿やコメントのデータを管理する役割を持ちます。
View(ビュー)
ビューはユーザーに表示される部分です。HTMLやCSS、JavaScriptを使って、実際に見えるインタフェースを作ります。モデルから受け取ったデータを表示したり、ユーザーとの対話を可能にするための要素(ボタン、フォームなど)を作成します。例えば、ブログの場合は、投稿一覧や個別の投稿表示などがビューになります。
Controller(コントローラ)
コントローラはユーザーの操作やリクエストを処理します。ユーザーからの入力を受け取り、それに応じて適切な処理を実行します。具体的には、リクエストを受け取ってモデルからデータを取得し、それをビューに渡す役割を担います。また、ビューからのユーザーの操作(ボタンのクリック、フォームの送信など)を受け取り、それに応じてモデルの更新や他の処理を実行します。
MVCアーキテクチャのメリットは、アプリケーションのコードを機能的に分割し、各パーツの役割を明確にすることです。これにより、コードの再利用性や保守性が向上し、変更や拡張が容易になります。例えば、ビューのデザインを変更する場合でも、モデルやコントローラのコードに手を加える必要がありません。
パーシャル化とは?
Ruby on Railsの用語で、HTMLを再利用可能な部分(パーシャル)に分割することを指します。パーシャルは、繰り返し使用されるコードを一箇所にまとめ、そのコード片を必要な場所で再利用するためのテクニックです。
たとえば、フォーム部分をパーシャル化するというのは、フォームのHTMLを別のファイル(通常は_form.html.erbなどと名付けられ、アンダースコアで始まるファイル名が一般的です)に切り出すことを意味します。そして、そのパーシャルは、renderメソッドを使って必要なビューから呼び出すことができます。
例えば、new.html.erbとedit.html.erbという2つのビューがあるとします。両方のビューでほぼ同じフォームが使われているとしましょう。この場合、フォームのHTMLをパーシャル(_form.html.erb)に切り出して、それぞれのビューで以下のように呼び出すことができます:
<%= render 'form' %>
これにより、フォームのコードを一箇所にまとめることができ、コードの重複を避け、保守性を向上させることができます。また、フォームの変更が必要な場合は、パーシャルを編集するだけで良くなります。
変数paramsの使い方
paramsはRuby on Railsで非常に重要な役割を果たすハッシュのようなオブジェクトです。paramsを使うと、コントローラーがブラウザから送られてきたパラメータ(情報)を取得することができます。主に、フォームから送信されたデータやURLの一部(例えば、URLのクエリパラメータやルーティングパラメータ)を取得するのに使われます。
URLのパラメータを取得する
paramsを使うと、URLの一部として送られてきた情報を取得することができます。
例えば、http://www.example.com/users/123
というURLがあるとします。
ここで123はユーザーのIDを表しています。このユーザーIDをコントローラー内で取得するには、以下のようにparamsを使います。
def show
@user = User.find(params[:id])
end
ここでparams[:id]はURLからID 123を取得します。
フォームからデータを取得する
フォームからデータを送信すると、そのデータはparamsを通じてコントローラーで取得することができます。例えば、ユーザー名とメールアドレスを持つフォームからデータを送信したとします。そのデータは、以下のようにparamsで取得できます。
def create
@user = User.new
@user.name = params[:name]
@user.email = params[:email]
@user.save
end
ここでparams[:name]とparams[:email]はフォームから送信されたユーザー名とメールアドレスを取得します。
なお、フォームから送信されるデータは通常、モデル名でネストされています。例えば、Userモデルのフォームからデータを送信すると、params[:user]の中にユーザーのデータが入っています。そのため、以下のようにデータを取得することがよくあります:
def create
@user = User.new(params[:user])
end
ここで、params[:user]はフォームから送信されたユーザーのデータを取得します。
ただし、このようにパラメータを直接モデルに渡すと、セキュリティの問題が生じる可能性があります。そのため、通常は"ストロングパラメータ"と呼ばれる手法を使って、許可されたパラメータだけをモデルに渡すようにします。ストロングパラメータの使用例は以下のようになります:
def create
@user = User.new(user_params)
end
private
def user_params
params.require(:user).permit(:name, :email)
end
ここで、user_paramsメソッドがストロングパラメータを定義しています。このメソッドはparams[:user]から:nameと:emailだけを許可して、それ以外のパラメータを排除します。
特定のルートを追加、除外
resources メソッドには only と except オプションがあり、これらは特定のルートだけを追加、除外するのに使うことができます。
例えば、todos リソースに対して index, show, new, create の 4 つのルートだけを生成したい場合、以下のように書くことができます:
resources :todos, only: [:index, :show, :new, :create]
逆に、すべての標準的なルートを生成したいけど、destroy ルートだけは除外したいといった場合には、以下のように except オプションを使うことができます:
resources :todos, except: [:destroy]
only や except オプションを使うことで、アプリケーションの要件に合わせてルーティングを細かく制御することができます。
よく使うコマンド一覧
Ruby on Railsでよく使われるコマンドの一覧
rails new [アプリ名]
: 新しいRailsアプリケーションを作成します。 末尾に--api
でapi作成
rails s(server)
: アプリケーションを開発用サーバーで起動します。
rails g(generate) [ジェネレータ名]
: モデル、コントローラ、ビューなどのコードを自動生成します。
rails g model モデル名 カラム名:データ型
postsテーブルをつくるにはモデル名をPostと単数形にする。
rails g controller コントローラ名 アクション名
コントローラー作成
rails consoleまたはrails c
: Railsコンソールを起動し、アプリケーションと対話します。
rails db:migrate
: データベースのマイグレーションを実行し、テーブルやスキーマを更新します。
rails db:create
: データベースを作成します。
rails db:drop
: データベースを削除します。
rails db:seed
: データベースに初期データを投入します。
rails routes
: アプリケーションのルーティング情報を表示します。
rails test
: テストスイートを実行し、テスト結果を表示します。
rails generate scaffold [モデル名]
: モデル、コントローラ、ビューなどを自動生成し、CRUD操作を提供するフル機能のリソースを作成します。
rails db:migrate:status
: マイグレーションの状態を表示します。
rails db:rollback
: 直近のマイグレーションをロールバックします。
rails db:reset
: データベースを削除し、マイグレーションを再実行して初期状態にリセットします。
rails db:setup
: データベースを作成し、マイグレーションを実行し、初期データを投入します。
データ型一覧
文字列型
VARCHAR(n): string
TEXT: text
CHAR(n): string(長さ固定の文字列)
整数型
INTEGER: integer
BIGINT: bigint
SMALLINT: smallint
浮動小数点数型
DECIMAL(p, s): decimal
FLOAT: float
REAL: float
日付型
DATE: date
DATETIME: datetime
TIME: time
TIMESTAMP: datetime
真偽値型
BOOLEAN: boolean
バイナリ型
BLOB: binary
BYTEA: binary
JSON型
JSON: json
JSONB: jsonb
配列型
ARRAY: array
列挙型
ENUM: enum
これらのデータ型は、Railsのマイグレーションファイル内で使用されます。マイグレーションファイルを使用してデータベースのスキーマを作成・変更する際に、適切なデータ型を選択して使用します。