【Ruby on Rails】コントローラとアクション

2021年10月8日

RailsアプリケーションはMVCアーキテクチャに基づいて、3つの部分で構成されています。ここでは基本となるC、つまりコントローラ」の基本的な仕組みを覚えましょう。

コントローラの基本

コントローラには以下の2点についてしっかり覚えておきましょう

  • コントローラの中には複数のアクションが含まれている
  • コントローラの名前の付け方には決まりがある

ということです。決まりがあるというのはRubyの特徴的なものなのでしっかりと叩き込むようにしましょう

コントローラクラスの書き方

コントローラはモデルからデータを受け取り、ビューにレンダリングを行わせます。ブラウザからのリクエストを受け取り、レスポンスを返すのもコントローラです。コントローラはApplicationControllerクラスのサブクラスとして実装します。

コントローラのパブリックメソッドをアクションと呼びます。アクションはウェブの1ページもしくは1つの機能のことをさします。

アクションで行うことは、テンプレート(ビュー)で表示するデータを用意して、インスタンス変数に値をセットすることです。アクションは、原則として同名のテンプレートを使います。indexアクションを呼び出すとindex.html.erbでレンダリングされます。

アクション内容によっては表示させる代わりにページのリダイレクトを返すこともあります

アクションじゃないメソッド!?

プライベート宣言することで、アクションではないメソッドを作ることも出来ます。基本的にはroutes.rbでアクションの制御はしていますが、クラス側でもうっかり呼ばれたくないアクションを作ったりした場合、privateで抑制することが出来ます。

命名規約

すでに説明したとおり、Railsの原則の1つとしてある「設定より規約」。モデル・コントローラ・ビューに関連するクラス名やファイル名には命名規則が決まっています。たとえばコントローラ名を「members」とした場合、各コントローラやビューの名前は以下のように決まります。

名前ルール
コントローラクラス名MembersController〇〇Controller
コントローラファイル名members_controller.rb〇〇_controller.rb
テンプレートのディレクトリ名app/views/membersapp/views/〇〇

まだ出てきていないモデルにも命名規則があります。モデル名を「member」とした場合は以下のようになります。

名前ルール
データベーステーブル名members戦闘は小文字、複数形にする
モデルクラス名Member先頭は大文字
モデルクラスのファイル名member.rb〇〇.rb

データベースのテーブル名に2つの単語からなる名前をつけたいときは、shopping_cartsのようにアンダースコアで単語と単語を結びます。すると、コントローラクラス名はShoppingCartsController、モデルクラス名はShoppingCartとなります。各単語の頭文字を大文字にする表記法は「キャメルケース」と呼ばれます

アクションで使える機能

練習の準備

ここまでの内容を一度復習がてら練習してみましょう。練習用のアクションとテンプレートを追加します。

bin/rails g controller lesson

次に、config/routes.rbを開いて最後のendの前に次のレッスン用のアクションを呼び出せるようにします。step1からstep18までのアクションを呼び出せるようにします。ちなみにroutes.rbもRubyが使えるので次のようにすることが出来ます。

1.upto(18) do |n|
 get "lesson/step#{n}{/:name}" => "lesson#step#{n}"
end

あとはlesson_controller.rbに各ステップに相当するアクション追加すればOK!

パラメータの取得

アクションに渡されるパラメータの種類

  • ルーティングの設定によってパスの中に埋め込まれるパターン
  • URLのクエリー部分に「?名前=値」で渡されるパターン

どちらのパターンも「params[:パラメータ名]」で取り出すことが出来ます。

paramsの機能

params[:パラメータ名]のparamsは、パラメータを含んだハッシュを返すメソッドです。単なるハッシュではなく、Hashを継承したActionController:Parametersというクラスのオブジェクトです。このクラスのハッシュは、文字列でもシンボルでも値を取り出せます。つまり、params[:name]とparam[“name]は同じ値を返します

paramsが返すパラメータには、コントローラ名とアクション名も含まれています。

  • params[:controller]でコントローラ名
  • params[:action]でアクション名

リダイレクション

HTTPのリダイレクトは、Railsではredirect_toメソッドで簡単に行なえます。redirect_toメソッドを呼び出すと、レンダリングは行われずにブラウザにステータスコード302と新しいURLが送られます。

下のような2つのアクションを用意した場合、step3を呼び出すとstep4にリダイレクトされます。

	def step3
		redirect_to action: "step4"
	end
	def step4
		render plain: "step4に移動しました"
	end

redirect_to “/lesson/step4″のようにパスやURL、を文字列で渡すことも可能です。

フラッシュ

Railsでリダイレクトを使う場合、同時にフラッシュという機能がよく用いられます。フラッシュはアクションとアクションの間で情報を受け渡す機能です。リダイレクションの前でflashオブジェクトに情報を入れておくと、リダイレクション後のアクションでその文字列を取り出すことが出来ます。

	def step5
		flash[:notice] = "step5でフラッシュに文字を書き込んだ"
		redirect_to action: "step6"
	end
	def step6
		render plain: flash[:notice]
	end

フラッシュデータは、「アクション→リダイレクション→アクション」の処理が済むと消去されます。上記のstep6アクションのページでリダイレクション後にブラウザをリロードすると、flash[:notice]はnilになります。

フラッシュの名前が:noticeまたな:alertの場合はredirect_toメソッドの第2引数にハッシュを加えて、リダイレクションとフラッシュの設定を同時に行うことも出来ます。