Railsでビューを表示する前の処理を行うコントローラを作成する方法や、ビューにデータを渡す方法および、別のビューファイルを指定する方法を実例で解説しています。
コントローラーとは?
Railsのコントローラとは、ユーザーのリクエスト(URLの入力)に対して、対象のページを開く前に行う処理を記述するファイルのことです。
ユーザーがWEBページにアクセスする際の一般的な流れは次のようになります。
ブラウザ → ルーティング → コントローラ → ビュー の流れです。
コントローラの作成方法
コントローラは決まったコマンドで生成することができます。
rails g controller <コントローラ名> <アクション名>
コントローラの命名規則
コントローラ名の命名規則は複数形が基本です(絶対条件ではありません)。
rails g controller <コントローラ名> <アクション名>
でコントローラが生成されます。生成したrbファイル内のクラス名(コントローラクラスといいます)とファイル名も指定した名前に沿って自動で生成されます。
項目 | (基本的な)命名規則 | 例 |
---|---|---|
コントローラ名 | 複数形。アッパーキャメルケース | UserNames |
コントローラクラス名 | 【自動生成】アッパーキャメルケース。末尾にControllerが追加される | UserNamesController |
ファイル名 | 【自動生成】 スネークケース | user_names_controller.rb |
アッパーキャメルケースは冒頭大文字のアルファベットです。単語の区切りごとに大文字にします。
スネークケースは全て小文字で、単語をアンダースコア_
でつなぐ記述方法です。
コントローラ作成で生成されるファイル
コントローラを生成すると、コントローラファイルと合わせて、最小で4つのファイルが自動で生成されます。
ファイル | 内容 | 例 |
---|---|---|
コントローラ | ビューに渡す処理を記述する。 | app/controllers/users_controller.rb |
テストコントローラ | test環境用のコントローラ | test/controllers/users_controller_test.rb |
ヘルパー | ビューファイル内で行う処理を書き出す。moduleになっていて、その中で関数を定義する。 | app/helpers/users_helper.rb |
SASS | ビューに適用するスタイルシート。scss形式で記述 | app/assets/stylesheets/users.scss |
アクションを指定すると、指定したアクション毎に追加でビューファイルが生成されます。また、ルーティングも作成してくれます。
(アクションを省略した場合はビュー用のディレクトリのみで、ビューファイルやルーティングは生成しません。)
indexアクションとshowアクションを指定した場合
ファイル | 内容 | 例 |
---|---|---|
ビューファイル | indexアクションで開くファイル | app/views/users/index.html.erb |
ビューファイル | showアクションで開くファイル | app/views/users/show.html.erb |
▼コントローラ
コントローラファイルはアクションが記述された状態になっています。
class UsersController < ApplicationController
def index
end
def show
end
end
ビューを表示する前に処理を行う場合は、defとendの間に処理を記述します。
▼ルーティングファイル
基本的なルーティングを自動で追記してくれます。
Rails.application.routes.draw do
get 'users/index'
get 'users/show'
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
コントローラ生成の実例
# rails g controller Users index show
Running via Spring preloader in process 370
create app/controllers/users_controller.rb
route get 'users/index'
get 'users/show'
invoke erb
create app/views/users
create app/views/users/index.html.erb
create app/views/users/show.html.erb
invoke test_unit
create test/controllers/users_controller_test.rb
invoke helper
create app/helpers/users_helper.rb
invoke test_unit
invoke assets
invoke scss
create app/assets/stylesheets/users.scss
コントローラを使ってページを表示する
実例として、実際にコントローラを生成して、WEBページを表示する処理を記述します。
コントローラの生成
# rails g controller Users index show
Running via Spring preloader in process 370
create app/controllers/users_controller.rb
route get 'users/index'
get 'users/show'
invoke erb
create app/views/users
create app/views/users/index.html.erb
create app/views/users/show.html.erb
invoke test_unit
create test/controllers/users_controller_test.rb
invoke helper
create app/helpers/users_helper.rb
invoke test_unit
invoke assets
invoke scss
create app/assets/stylesheets/users.scss
この時点で、自動的にビューファイルを生成し、ルーティングが追記されるのでページにアクセスすることができます。
▼http(s)://ドメイン/users/index
▼ http(s)://ドメイン/users/index
コントローラからビューにデータを渡す
コントローラからビューにデータを渡すには、渡すデータとして@(アットマーク)をつけた変数を定義する必要があります。
ビューファイルの中で呼び出すときは、<%= インスタンス変数 %>
とします。
例として、@testというインスタンス変数を定義して、ビューファイルで呼び出します。
コントローラ
class UsersController < ApplicationController
def index
@test = 'テスト'
end
(省略)
end
ビューファイル
<h1>Users#index</h1>
<p><%= @test %></p>
以上で設定は完了です。
▼ブラウザの表示
コントローラで定義した @test
を呼び出すことができました。
注意点
@をつけたインスタンス変数ではなくローカル変数を渡そうとするとエラーが発生します。
コントローラ
class UsersController < ApplicationController
def index
test = 'テスト'
end
(省略)
end
ビューファイル
<h1>Users#index</h1>
<p><%= test %></p>
コントローラ内の@変数を @なしで呼び出すこともできません(@test ≠ test)。変数は用途によって書き方が決まっています。
コントローラでパラメータを受け取る
パラメータの受け渡し方法
URLにパラメータが渡されたときに、そのデータを受け取ることができます。
例えばGETメソッドの場合、パラメータ付きのURLは次のようになります。パラメータは&で複数つなげることができます。
#パラメータが1つ
Example Domainパラメータ名=値
#パラメータが複数
Example Domainパラメータ名1=値1&パラメータ名2=値2&,,,
#配列で受け取る
Example Domainパラメータ名[]=値1&パラメータ名[]=値2&,,,
このパラメータを受け取るためには、params[:パラメータ名]
とします。
パラメータの受け渡し実例
例えば、idとnameというパラメータをURLから受け取りコントローラからビューに渡す場合は次のようになります。
コントローラ
class UsersController < ApplicationController
def index
@id = params[:id]
@name = params[:name]
end
(省略)
end
ビューファイル
<h1>Users#index</h1>
<p>ID:<%= @id %> 名前:<%= @name%></p>
▼ブラウザの表示
URLに入力されている、idとnameを画面上に表示できました。
パラメータはビューで直接呼び出せる
今回はパラメータをコントローラで受け取り、ビューファイルに渡しました。ですが、パラメータはビューファイルで直接受け取ることもできます。
受け取りは<%= params[:パラメータ名] %>
とします。
このため、コントローラでパラメータを受け取る場合は、受け取ったデータに処理を加えてビューに渡すときのみで十分です。
ビューファイルで直接呼び出す例
試しに、ビューファイルでパラメータを直接呼び出します。
<h1>Users#index</h1>
<p>ID: <%= params[:id] %></p>
<p>名前: <%= params[:name] %></p>
▼ブラウザの表示
http://localhost:3001/users/index?id=124&name=test
コントローラで開くページを変更する
デフォルトの状態では、コントローラのアクションで開くビューファイルは指定された状態になっています。
例えば、UsersControllerのindexアクションでは、usersディレクトリのindex.html.erb(views > users > index.html.erb)を開きます。
この対象のビューファイルを変更することもできます。
別のページを開く
別のページを開くには、コントローラの処理の中に render "URI"
を記述します。(URIはドメイン名以下のURL)
例えば、Usersコントローラのindexアクションに、render "users/show"
を記述すると、
ユーザーがブラウザから http://example.com/user/indexをリクエストしたときに、Railsアプリケーションは http://example.com/user/show に該当するページを開きます。
コントローラ
class UsersController < ApplicationController
def index
render "users/show"
end
def show
end
end
▼ブラウザの表示
リダイレクトする
redirect_toメソッドを使えば、リダイレクトして指定したページを開くこともできます。
redirect_toには様々な指定方法があります。
指定方法 | 内容 | 実例 |
---|---|---|
“URL” | 指定したURLに飛ばす(別のサイトも可) | redirect_to “https://example.com/users/index” |
Prefix名 | 指定したプレフィックスのルートに飛ばす。prefixの後ろに、_urlか_pathをつけます。 (prefixはルート一覧で確認できます rails routes ) | redirect_to users_index_url redirect_to users_index_path |
controller: :コントローラ名, action: :アクション名 | コントローラとアクションを指定 | redirect_to controller: :users, action: :index |
action: :アクション名 | 同じコントローラ内であれば、コントローラ名を省略できます。 | redirect_to action: :index |
:back | 前のページにリダイレクト(戻る) | redirect_to :back |
なお、デフォルトでは302(一時的な転送)になります。
301などのステータスコードを指定する場合は、 , status: ステータスコード
で指定します。(決められたシンボルで指定することもできます)
追加でデータを渡したい場合は、, データ名: 値
とすれば、パラメータとしてデータを渡すことができます。
コントローラ名やアクション名を使って指定するときに、パラメータを渡す場合は、notice, alert, flashを使うときは、カッコ({ })を使って区切りをつける必要があります。
(詳細)【Rails】redirect_toでnoticeやflash, alertがパラメータになる場合の対処法
リダイレクトの実例
例えば、Usersコントローラのindexアクションに、redirect_to action: :show
を記述すると、
ユーザーがブラウザから http://example.com/user/indexをリクエストしたときに、Railsアプリケーションは http://example.com/user/show を開きます。(URLが変わります)
コントローラ
class UsersController < ApplicationController
def index
redirect_to action: :show
end
def show
end
end
▼ブラウザの表示
renderメソッドと違い、URLも変更されていることがポイントです。