【Rails】コントローラの作成方法と使い方実例|ビューにデータを渡す方法と別のビューファイルを指定する方法

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。

Railsでビューを表示する前の処理を行うコントローラを作成する方法や、ビューにデータを渡す方法および、別のビューファイルを指定する方法を実例で解説しています。


コントローラーとは?

Railsのコントローラとは、ユーザーのリクエスト(URLの入力)に対して、対象のページを開く前に行う処理を記述するファイルのことです。

ユーザーがWEBページにアクセスする際の一般的な流れは次のようになります。

RailsでWEBページが表示されるまでの流れ
  1. ブラウザでURLを叩く
  2. ルーティングファイルでコントローラとアクションを指定
  3. コントローラの処理を実行
  4. コントローラに対応するビューを開く

ブラウザ → ルーティング → コントローラ → ビュー の流れです。


コントローラの作成方法

コントローラは決まったコマンドで生成することができます。

rails g controller <コントローラ名> <アクション名>
tips
  • アクション名は省略できます。
  • アクションは後からファイル内で、追加・削除・編集できます。
  • g は generate の省略形です。
  • ビューファイルやヘルパーファイルも同時に生成します。
  • ルーティングを自動で追加してくれます。


コントローラの命名規則

コントローラ名の命名規則は複数形が基本です(絶対条件ではありません)。

rails g controller <コントローラ名> <アクション名>でコントローラが生成されます。生成したrbファイル内のクラス名(コントローラクラスといいます)とファイル名も指定した名前に沿って自動で生成されます。

項目(基本的な)命名規則
コントローラ名複数形。アッパーキャメルケースUserNames
コントローラクラス名【自動生成】アッパーキャメルケース。末尾にControllerが追加されるUserNamesController
ファイル名【自動生成】 スネークケースuser_names_controller.rb

アッパーキャメルケースは冒頭大文字のアルファベットです。単語の区切りごとに大文字にします。

スネークケースは全て小文字で、単語をアンダースコア_でつなぐ記述方法です。

tips
  • コントローラ名が単語一つ(例: Users)の場合は小文字で指定しても、自動でアッパーキャメルケースに変換してくれます。

    例: users → Users と認識
  • なお、モデル名の命名規則は単数形のアッパーキャメルで指定します。(自動で複数形のテーブルが生成されます)


コントローラ作成で生成されるファイル

コントローラを生成すると、コントローラファイルと合わせて、最小で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
tips

ルーティングファイルで、get 'コントローラ名/アクション名' と記述すると、

http(s)://example.com/コントローラ名/アクション名 にアクセスしたときに、対象のコントローラのアクションを実行します。

詳細は下記をご参考ください。

【Rails】ルーティング getやrootどれを使うべきか?省略形やその他の指定方法とエラーが出る時の注意点


コントローラ生成の実例

# 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

コントローラからビューにデータを渡す

コントローラからビューにデータを渡すには、渡すデータとして@(アットマーク)をつけた変数を定義する必要があります。

tips
  • @をつけた変数をインスタンス変数と呼びます。
  • @を付けない変数をビューファイルで呼び出すとエラーになります。
  • @を付けない変数をローカル変数と呼びます。クラス内でのみ使う場合に有効です。

ビューファイルの中で呼び出すときは、<%= インスタンス変数 %>とします。

例として、@testというインスタンス変数を定義して、ビューファイルで呼び出します。

コントローラ

class UsersController < ApplicationController
  def index
    @test = 'テスト'
  end

  (省略)
end

ビューファイル

<h1>Users#index</h1>
<p><%= @test %></p>
tips

ビューファイルでRubyの処理を呼び出す方法は、<%= %>以外にも種類があります。

記述内容
<% 処理 %>処理のみ。出力しない
<%= 処理 %>処理結果を出力する
<%== 処理 %>処理結果をエスケープしないで出力する。
<%# コメント %>コメントアウト
<% 処理 -%>後ろの改行を取り除く
<%- 処理 %>行頭までの空白を削除

以上で設定は完了です。

▼ブラウザの表示

コントローラで定義した @test を呼び出すことができました。


注意点

@をつけたインスタンス変数ではなくローカル変数を渡そうとするとエラーが発生します。

コントローラ

class UsersController < ApplicationController
  def index
    test = 'テスト'
  end

  (省略)
end

ビューファイル

<h1>Users#index</h1>
<p><%= test %></p>
エラー内容

wrong number of arguments (given 0, expected 2..3)

コントローラ内の@変数を @なしで呼び出すこともできません(@test ≠ test)。変数は用途によって書き方が決まっています。

tips

Rubyの変数の種類

変数名称内容
@変数名インスタンス変数インスタンス毎に固有。コントローラからビューファイルへの受け渡しに使う
変数名ローカル変数関数の中でのみ使う
$変数名グローバル変数全体で共通の変数
@@変数名クラス変数同じクラスから生成されたすべてのインスタンスで共通


コントローラでパラメータを受け取る

パラメータの受け渡し方法

URLにパラメータが渡されたときに、そのデータを受け取ることができます。

例えばGETメソッドの場合、パラメータ付きのURLは次のようになります。パラメータは&で複数つなげることができます。

#パラメータが1つ

Example Domain
パラメータ名=値 #パラメータが複数
Example Domain
パラメータ名1=値1&パラメータ名2=値2&,,, #配列で受け取る
Example Domain
パラメータ名[]=値1&パラメータ名[]=値2&,,,

このパラメータを受け取るためには、params[:パラメータ名]とします。

tips

パラメータは、GETメソッドとPOSTメソッドでデータの受け渡し方法が異なります。

GETメソッドの場合は、URLの後ろに ?パラメータ名=値 として渡します。文字数の制限があるのと、誰もが見れるためセキュリティ上はよくありません。


POSTメソッドはURLではなく、リクエストの中にデータが埋めこみます。文字数の制限がなく長文を送るのに適しています。


パラメータの受け渡し実例

例えば、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>

▼ブラウザの表示

http://localhost:3001/users/index?id=124&name=test

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: ステータスコードで指定します。(決められたシンボルで指定することもできます)

(参考)Rails公式 レイアウトとレンダリング

追加でデータを渡したい場合は、, データ名: 値 とすれば、パラメータとしてデータを渡すことができます。

コントローラ名やアクション名を使って指定するときに、パラメータを渡す場合は、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も変更されていることがポイントです。


参考リンク

タイトルとURLをコピーしました