iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
Modern Web

Rails guide / Ruby API study系列 第 11

[ Rails guide study ] Day11 教你怎麼傳變數給 partial

  • 分享至 

  • xImage
  •  

Layouts and Rendering in Rails Part4

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


傳變數給 partial

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

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

1. 使用 locals

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

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

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

2. 使用 obeject

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

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

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

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

3. 使用 collection

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

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

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

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

<%= render @customers %>

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

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

<!-- 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 的話會看到一種畫面,如果沒給則會看到另一種

<!-- _form.html.erb -->
<h1>這是 form 的畫面喔!</h1>
<% if local_assigns[:qoo1] %>
有給 qoo1 的才看得到這句 
<%= qoo1 %>

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

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

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

看到的畫面如下

反之,如果沒有給 qoo1 的話

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

看到的畫面如下


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

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

參考資料
Rails Guide

Extending Rails partials using local_assigns

Layout, Render 與 View Helper

本文章同步分享於 http://anthonychao.site/


上一篇
[ Rails guide study ] Day10 partial 的使用
下一篇
[ Rails guide study ] Day12 REST & Controller 命名慣例
系列文
Rails guide / Ruby API study30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

此處能否理解為,「反向」從網頁傳變數給layout(模板)?為什麼不直接在模板把東西寫好就好?
在使用object與collection的例子中,那兩個變數(object: @qoo1 與collection: @forms)內容差別是什麼?為什麼後者是一組變數?

我要留言

立即登入留言