renderにインスタンス変数を渡す場合
renderにインスタンス変数を渡す場合の使い方
以下のようにコントローラで取得したレコードの数だけrenderするのを防ぐために、renderに直接コントローラで取得したインスタンス変数を渡す方法があるが、その解釈が誤っていたので、こちらに記載します。
コントローラで取得したレコードの数だけrenderされるケース (each文で[_board.html.erb]が何度もrenderされてしまう。)
[app/controller/board_controller.rb] def index @boards = Board.all end
[app/views/index.html.erb] <% @boards.each do |board| %> <%= render partial: "board", locals: { board: board } %> <% end %>
上記を回避して何度もrenderされるのを防ぐ記述が以下 ([_board.html.erb]を取得しているレコードの数だけ作成し、それを一気にrenderするイメージ。)
[app/controller/board_controller.rb] def index @boards = Board.all end
[app/views/index.html.erb]
<%= render @boards %>
今までの解釈が以下であったが、実際は違っていました。。。。
・呼び出す部分テンプレート[board.html.erb]がviewsフォルダ内にあるboardsフォルダに存在する。
・部分テンプレート名がboard.html.erb(取得しているインスタンス変数の単数形)である。
・部分テンプレート内で使う変数がboard(取得しているインスタンス変数の単数形)である。
正しくは、以下になります。
・呼び出す部分テンプレート[board.html.erb]がviewsフォルダ内にあるboardsフォルダ(インスタンス変数を取得しているコントローラ)以下に存在する。
・部分テンプレート名がboard.html.erb(取得しているインスタンス変数名は関係なく、実際に取得しているテーブルの単数形)である。
・部分テンプレート内で使う変数がboard(取得しているインスタンス変数名は関係なく、実際に取得している変数の単数形)である。
つまり、Railsは「変数名」ではなく「変数の実体」を元に使用すべき部分テンプレートを推測する。
ex)
[app/controller/user_controller.rb] def index @boards = User.all end
[app/views/index.html.erb]
<%= render @boards %>
{board.html.erb}ではなく、{user.html.erb} [app/views/users/_user.html.erb]がrenderされる