Ruby on Railsのコントローラーは、MVCアーキテクチャにおいてリクエストの受け取りとレスポンスの返却を担当する中心的な役割を果たします。ユーザーからのHTTPリクエストを受け取り、モデルを通じてデータを取得・操作し、ビューにデータを渡して最終的なHTMLを生成します。この記事では、コントローラーの作成方法から実践的な使い方まで解説します。
基本的な使い方
コントローラーは、ターミナルでrails generate controllerコマンドを実行して作成します。
rails generate controller Postsこのコマンドを実行すると、以下のファイルが自動生成されます。
app/controllers/posts_controller.rb- コントローラー本体app/views/posts/- ビュー用ディレクトリapp/helpers/posts_helper.rb- ヘルパーファイルtest/controllers/posts_controller_test.rb- テストファイル
rails generateはrails gと省略できます。例: rails g controller Posts
コントローラーの基本構造
生成されたコントローラーファイルを開くと、以下のような基本構造になっています。
class PostsController < ApplicationController
endすべてのコントローラーはApplicationControllerを継承します。アクション(メソッド)を追加することで、各URLに対応する処理を定義できます。
class PostsController < ApplicationController
def index
render plain: "投稿一覧ページです"
end
end上記の例ではrender plain:を使って単純なテキストを返していますが、実際の開発ではビューテンプレートを使用するのが一般的です。
ルーティングの設定
コントローラーを作成しただけでは、どのURLでアクセスすればよいかRailsにはわかりません。config/routes.rbでルーティングを設定する必要があります。
Rails.application.routes.draw do
get "posts" => "posts#index"
endこの設定により、/postsにGETリクエストが来た場合、PostsControllerのindexアクションが実行されます。特定のパスを指定する方法もあります。
Rails.application.routes.draw do
root "posts#index" # トップページ
get "posts", to: "posts#index" # 一覧ページ
get "posts/:id", to: "posts#show" # 詳細ページ
endアクションとビューの連携
Railsでは、コントローラーのアクション名に対応するビューファイルが自動的にレンダリングされます。例えば、PostsControllerのindexアクションは、明示的にrenderを記述しなくてもapp/views/posts/index.html.erbを表示します。
class PostsController < ApplicationController
def index
@posts = Post.all
# 自動的にapp/views/posts/index.html.erbがレンダリングされる
end
def show
@post = Post.find(params[:id])
# 自動的にapp/views/posts/show.html.erbがレンダリングされる
end
endインスタンス変数(@で始まる変数)に代入したデータは、ビュー内で参照できます。これがコントローラーからビューへのデータの受け渡し方法です。
CRUD操作の実装
実際のWebアプリケーションでは、データの作成(Create)、読み取り(Read)、更新(Update)、削除(Delete)を行うCRUD操作を実装します。
class PostsController < ApplicationController
def index
@posts = Post.all
end
def show
@post = Post.find(params[:id])
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post, notice: "投稿が作成されました"
else
render :new
end
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
if @post.update(post_params)
redirect_to @post, notice: "投稿が更新されました"
else
render :edit
end
end
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to posts_path, notice: "投稿が削除されました"
end
private
def post_params
params.require(:post).permit(:title, :content)
end
endprivateメソッドのpost_paramsはStrong Parametersと呼ばれる仕組みで、フォームから送信されたデータのうち許可されたパラメータのみを受け付けます。これにより、不正なパラメータの送信を防ぐことができます。
アクション付きでコントローラーを生成
コントローラー生成時にアクション名を指定すると、対応するビューファイルやルーティングも同時に生成できます。
rails g controller Posts index show new editこのコマンドにより、各アクションに対応するビューテンプレートとルーティングが自動生成されるため、すぐに開発を始められます。
RESTfulなリソースを扱う場合は、resources :postsをルーティングに定義する方が推奨されます。rails generate controllerで生成されるルーティングは個別のget定義になるため、後から修正が必要になることがあります。
まとめ
rails generate controller コントローラー名でコントローラーを作成する- コントローラーのアクション(メソッド)がHTTPリクエストに対応する処理を定義する
config/routes.rbでURLとアクションのマッピングを設定する- インスタンス変数(
@変数名)でコントローラーからビューにデータを渡す - Strong Parameters(
params.require().permit())で安全にパラメータを受け取る - CRUD操作(index, show, new, create, edit, update, destroy)が基本のアクション