教你怎麼傳變數給 partial

Posted by Anthony Chao on 2019-09-12

Layouts and Rendering in Rails Part4

首先來聽首歌吧
Yes
這是一個主要都用木吉他伴奏的外國素人歌手,在這裡也推薦大家聽聽看囉!


傳變數給 partial

今天的文章從這裡的 3.4.4 段落開始

假設 _qoo.html.erb 裡面有使用 qoo1 這個變數,我們要怎麼傳給他呢?
Rails Guide 中提到了滿多方法,這邊一一來說明:

1. 使用 locals

1
<%= render partial: "form" , locals: {qoo1: @qoo1} %>

但文章中沒提到的是,如果你今天把前面的 partial 給省略掉,後面使用 locals 是會發生錯誤的,這時候需要把 locals 也省略掉變成下面這樣

1
<%= render "form" , qoo1: @qoo1 %>

2. 使用 obeject

當我們使用一個 partial 的時候,他其實會內建一個跟這個 partial 名字相同的區域變數,我們可以使用 object 這個屬性,把值傳給他

1
2
<!-- index.html.erb -->
<%= render partial: "form" , object: @qoo1 %>

_form.html.erb 裡面只要用 form 這個變數就可以拿到了!

1
2
<h1>這是 form 的畫面喔!</h1>
<%= form %>

3. 使用 collection

除此之外,還可以傳一整組的變數進去
一般來說,我們如果要在首頁印出一大堆資料庫裡面的資料,會使用 each 來印,但 collection 這個屬性,讓我們可以讓程式碼更簡潔

1
2
<!-- index.html.erb -->
<%= render partial: "form", collection: @forms %>
1
2
<!-- _form.html.erb -->
<p>form 名字 <%= form.name %></p>

如此一來,看你的資料有幾組,就會幫你印幾組的資料,這時候你的頁面應該長得像下面這樣

甚至你可以再更進一步簡化變成下面這樣

1
<%= render @customers %>

不過必須提醒一下,像這種魔術的用法, partial 的檔案必須放在對的資料夾中才會起作用,在這個例子中是放在 views/forms 這個資料夾,除此之外還需要有 Form 這個 model,還有什麼時候用複數什麼時候用單數也都完全不能錯,眾多條件缺一不可,因此也不是很實用的一個技能 XD

當你在使用 collection 傳變數時,如果 partial 裡面的區域變數名字不同的話你可以使用 as 這個屬性修改

1
2
<!-- index.html.erb -->
<%= render partial: "form", collection: @forms, as: :qoo%>

在上面這個例子中,就可以使用從 controller 那邊接收到的 @forms 這個實體變數,傳到 partial 中的 qoo 區域變數使用


Local assigns

除此之外,文章中還提到 local_assigns 這個方法,它可以用來判斷是否這個 partial 頁面有被給予變數,不過我覺得 Rails Guide 裡面提到的範例實在讓人太難懂,所以只好自己做個簡單的範例:

下面是 partial 的檔案,我們直接把條件判斷利用 local_assigns 寫在裡面,如果有給 qoo1 的話會看到一種畫面,如果沒給則會看到另一種

1
2
3
4
5
6
7
8
9
<!-- _form.html.erb -->
<h1>這是 form 的畫面喔!</h1>
<% if local_assigns[:qoo1] %>
有給 qoo1 的才看得到這句
<%= qoo1 %>

<% else %>
沒給 qoo1 的才看得到這句
<% end %>

今天我的 index 頁面如果有給 qoo1 這個變數的話

1
2
<!-- index.html.erb -->
<%= render "form" , qoo1: @qoo1 %>

看到的畫面如下

反之,如果沒有給 qoo1 的話

1
2
<!-- index.html.erb -->
<%= render "form" %>

看到的畫面如下


剩下 Rails Guide 還有介紹一些上面這些方法的組合技,再麻煩大家自己看一下了~

希望這次介紹傳變數給 partial 的方法有幫助到大家,畢竟測試哪些方法需要符合哪些慣例也是花了我不少時間,希望這時間花得很值得!

參考資料
Rails Guide

Extending Rails partials using local_assigns

Layout, Render 與 View Helper





prevent_hack