1 minute read

關於 rails 中的 partial render


photo by drrpal

前提:初學者的學習筆記,僅供參考,敬請指教~

在 rails 裡,重複使用到的 view 可以進行模組化,使用的方法叫做 partial render(局部渲染)。

在進行 partial render 時可以傳遞變數進去,避免 view 在空中抓實體變數的問題,這又分為 localscollection 兩種方法。

partial render

partial render 可以理解為「借畫面來渲染」。當一段 view 重複被使用到時,我們就可以把它獨立整理一個檔案,讓需要這段 view 的頁面去渲染該檔案。

在進行局部渲染時,慣例是在渲染的檔案前加底線 _。比如 index.html.erb 去局部渲染 "form",而這個檔案的名稱會是_form.html.erb

# index.html.erb

<h1>這是 index 的內容</h1>
<%= render partial: "form" %>

<%= render partial: "form" %> 也可以簡寫成:

<%= render "form" %>

渲染檔名需要加底線 _

# _form.html.erb

<h2>這是 form 的內容</h2>

locals

通常我們在渲染的時候,會搭配從資料庫的撈出來的資料進行渲染。 我們在 controller 處理時會是一個實體變數,再讓相應的 view 取用。

locals 可以讓實體變數轉變成區域變數,使得局部渲染的檔案被動接受資料,而不需要去抓空中的實體變數。

這回應到 MVC 的應用原則,view 應該只負責呈現畫面,而不會有太多主動的行為。

以下為 view 抓取實體變數的例子(不推薦):

# index.html.erb

<h1>這是 index 的內容</h1>
<%= render "form" %>
# _form.html.erb

<h2>這是 form 的內容</h2>
<div> <%= @users %> </div>
# 要主動去找有沒有 @user 這個實體變數

可以使用 locals 改成:

# index.html.erb

<h1>這是 index 的內容</h1>
<%= render partial: "form", locals:{users: @users} %>
# 將實體變數 @user 轉為區域變數 user ,傳進局部渲染的檔案
# _form.html.erb

<h2>這是 form 的內容</h2>
<div> <%= users %> </div>
# 被動接受區域變數

<%= render partial: "form", locals: {users: @users} %>可以簡寫成:

<%= render "form", users: @users %>

這個寫法

collection

collection 除了可以像 locals 做到將實體變數轉為區域變數,還順便幫我們把 each 迴圈做完了。不過要使用 collection 需要依賴相當多慣例,先舉一個例子:

# index.html.erb

<h1>這是 index 的內容</h1>
<%= render partial: "user", collection:  @users} %>
# _user.html.erb

<h2>這是 user 的內容</h2>
<div> <%= user.name %> </div>
# 不用再做迴圈,就可以把東西一個一個印出來

使用 collection 需要許多的巧合:

  1. 局部渲染的檔名(_user.html.erb)必須以那包資料(@users)的「單數」命名。
  2. 局部渲染的檔案必須放在同個資料夾層級。
  3. 局部渲染檔案內的區域變數必須是單數(user)。

而且<%= render partial: "user", collection: @users} %>還可以簡寫成:

<%= render @users} %>

假如可以把這些巧合湊齊,就能使用這短短的程式碼進行 collection 渲染了。

參考文章: