【Rails】render メソッドの引数のルールを徹底解説!!【初心者向け】

Ruby on Rails

render メソッドの引数に何を指定しているのかさっぱりわかりません・・・

そんな疑問にお答えします!

Ruby on Rails の render メソッドをなんとなく使ってないでしょうか。
render メソッドの使い方が分かっていなくても最初はなんとなくうまくいくことがありますが、少しでも込み入ってくるとすぐにつまづきます。
逆に render メソッドをしっかりと理解しておくとプログラムを自身を持って書けるようになります。

本記事では特に初心者が理解したほうがいい「render メソッドの引数のルール」を詳しく解説します。

render メソッドの引数のルールがわかれば、Rails アプリケーションの実装力が身につきますよ!!

render メソッド全般についての解説は以下の記事も参照してください。
【Rails】renderの解説!基本・引数・オプションを完全理解!

render メソッドとは

render メソッドの役割

render は HTTP レスポンスを作るためのメソッドの一つです。
特徴としては「erb などのテンプレートファイル」を使って 「HTML などのレスポンス」を作ります。

本記事では基本となる「erb で HTML のレスポンスを作る」方法について解説します。
他には以下のパターンもありますが、本記事では解説していません。

  • テンプレートファイルを使わない方法
  • HTMLではないレスポンスを作る方法

render メソッドの使い方

コントローラで呼び出される render メソッドの引数のパターンを解説していきます。

render メソッドの基本は erb ファイルを使って HTML を作ることです。
そのため、render メソッドの引数で erb ファイルのパスを指示する方法を理解しましょう。

render template: ‘xxx/yyy’

引数に以下のハッシュを指定します。

キー:template
erb ファイルパスを表す文字列

以下の形です。

render templete: 'xxx/yyy'

ファイルパスは以下のルールで省略されます。

  1. ファイルパスのうち、先頭の「app/views」を省略する
  2. 拡張子を省略する

例えば

app/views/users/index.html.erb

というパスのerbファイルを使いたい場合は、

となり、

render templete: 'users/index'

と指定することになります。

ただし、template: で指定するのは少々古い書き方です。
現在は必要がなければ次に説明するように、省略する方が一般的です。

template: は省略できる

template: は省略できます。

render 'xxx/yyy'

erbファイルパスの指定方法は template: で指定した場合と同じです。

例えば

render 'users/index'

なら、

app/views/users/index.html.erb

を使用して HTML を作る、という命令となります。

フォルダ名はコントローラ名なら省略できる

render 'xxx/yyy'

の ‘xxx/yyy’ のうち、フォルダ名の部分(xxx/)はコントローラ名に一致する場合に省略可能です。

ただし、ここで言うコントローラ名はコントローラのクラス名から以下の手順で変換したものです。

  1. Controller を省略する
  2. スネークケース化する

例えば、以下の PrivatePostsController であれば、

class PrivatePostsController < ApplicationController
end

以下のように変換され、コントローラ名は private_posts となります。

補足: スネークケースとは

スネークケースとは複数単語からなる変数やクラス名などを1単語のように記述するためのルールの一つです。
以下のルールで書きます。

  • すべて小文字
  • 単語の区切りはアンダースコア(_)でつなぐ

例えば Happy birthday なら happy_birthday となります。
Ruby では以下をスネークケースで命名するのが一般的です。

  • 変数名
  • メソッド名
  • ファイル名

一方、単語の先頭をすべて大文字にして結合して記述するルールを Pascal ケースと呼びます。
例えば Happy birthday なら HappyBirthday となります。

Ruby では、以下をPascal ケースで命名するのが一般的です。

  • クラス名
  • モジュール名

もし、このコントローラで

app/views/private_posts/index.html.erb

というファイルを使ってHTMLを作りたい場合、本来は

class PrivatePostsController < ApplicationController
  def index
    render 'private_posts/index'
  end
end

のように、render の引数を ‘private_posts/index’ としなければならないところです。
しかしフォルダ名(private_posts)とコントローラ名(PrivatePostsController→private_posts)が一致しているので以下のように’index’ だけにすることができます。

class PrivatePostsController < ApplicationController
  def index
    render 'index'
  end
end

フォルダ名が無いときはシンボルでもいい

render 'index'

のように省略されて引数の文字列にフォルダ名が無い場合は

render :index

のようにシンボルとしてもオーケーです。

経験上、スラッシュがない場合はシンボルで記述する事が多いです。

フォルダ名=コントローラ名、ファイル名=アクション名なら renderメソッドの呼び出し自体を省略できる

Ruby on Rails を学習しているとコントローラのコードで

class UsersController < ApplicationController
  def index
    @users = User.all
  end
end

のように render も redirect_to も呼んでいないコードを見たことはないでしょうか。

実はこの場合でも暗黙に render メソッドが呼ばれています。
ここが Ruby on Rails の初学者に分かりづらいところです。

具体的には、render の引数を

  • フォルダ名がコントローラ名
  • ファイル名がアクション名

として呼ばれたことになります。

つまり、上記の例では

  • フォルダ名 = users (コントローラ名)
  • ファイル名 = index (アクション名)

であるため、以下のように記述したのと同じです。

class UsersController < ApplicationController
  def index
    @users = User.all
    render 'users/index'
  end
end

そのため、

app/views/users/index.html.erb

を使用して HTML を作る、という命令となります。

まとめ

render メソッドはコントローラとビューをつなぐ大切なメソッドです。
render メソッドの引数は以下のように理解しておきましょう。

  • erbファイルへのパスを表している
  • コントローラ名やアクション名による省略記法がある

Ruby や Ruby on Rails では「できるだけ省略する」という文化があります。
本記事で紹介した「省略ルール」を覚えておくと短く書けますし、他人の書いたコードもスラスラと読めるようになり、上達できます。

render メソッド全般についての解説は以下の記事も参照してください。
【Rails】renderの解説!基本・引数・オプションを完全理解!

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