基本

Ruby on Railsのコントローラーの基本

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 generaterails gと省略できます。例: rails g controller Posts

コントローラーの基本構造

生成されたコントローラーファイルを開くと、以下のような基本構造になっています。

app/controllers/posts_controller.rb
class PostsController < ApplicationController
end

すべてのコントローラーはApplicationControllerを継承します。アクション(メソッド)を追加することで、各URLに対応する処理を定義できます。

app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    render plain: "投稿一覧ページです"
  end
end

上記の例ではrender plain:を使って単純なテキストを返していますが、実際の開発ではビューテンプレートを使用するのが一般的です。

ルーティングの設定

コントローラーを作成しただけでは、どのURLでアクセスすればよいかRailsにはわかりません。config/routes.rbでルーティングを設定する必要があります。

config/routes.rb
Rails.application.routes.draw do
  get "posts" => "posts#index"
end

この設定により、/postsにGETリクエストが来た場合、PostsControllerのindexアクションが実行されます。特定のパスを指定する方法もあります。

config/routes.rb
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を表示します。

app/controllers/posts_controller.rb
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操作を実装します。

app/controllers/posts_controller.rb
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
end

privateメソッドの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)が基本のアクション