[Rails] Action View, Layout, Partial, Render
Action View Overview @ RailsGuides Layouts and Rendering in Rails @ RailsGuides
[TOC]
速記
# 當 yield 後沒有接任何參數時,
# 它會自動轉譯該 controller#action 下的
# views/controller_name/action_name.html.erb 樣版(template)
<%= yield %>
概念
在 Rails 中,web requests 是透過 Action Controller 和 Action Viewer 來處理,一般來說 Action Controller 關注的是和資料庫溝通以及處理 CRUD;Action View 則負責編譯要回傳的 response。
從 Controller 中,我們主要有三種建立回應的方式,分別是 render
, redirect_to
和 head
:
render
: 建立一個完整的回應,並回傳給瀏覽器。redirect_to
:傳送 HTTP redirect status code 給瀏覽器。head
:傳送只有 HTTP headers 的內容給瀏覽器。
在 Rails 中,一份完整的 HTML 檔會包含 templates
, partials
和 layouts
三個部分。
Templates
一般來說,我們不會在 View 中去使用 puts
或 print
來輸出結果,而是直接使用 <%= %>
。
慣例:在
articles_controller.rb
中的 index action (articles#index
)會使用在app/views/articles
中的index.html.erb
這支 Template。
Partials
keywords: render
, collection
Partial Templates 一般會簡稱為 partials,透過 partials,可以把重複的 code 拉出來,在其他的 templates 中重複使用它。
慣例:partials 命名的慣例會在檔名前面加上底線
_
,以此來區別是一般的 templates 或是 partials 。
render 的使用(in Views)
使用 render
關鍵字可以載入 partials:
# 會去轉譯同資料夾下的 _menu.html.erb 這支檔案
<%= render "menu" %>
# 會去轉譯 app/views/shared/_menu.html.erb 這支檔案
<%= render "shared/menu" %>
render 可以接受兩個參數,partials
和 locals
,在預設的情況下,會以和該 partials 同名的方式來命名 partial 中的 local variable。
透過 locals
我們可以在 _product.html.erb
這個 partial 中使用 product
這個 local variable,值則是 @product
:
<%= render partial: "product", locals: { product: @product } %>
# 縮寫
<%= render "product", product: @product %>
# 再縮
<%= render partial: "product" %>
options
object
:可以在 partial 的檔案中透過product
這個 local_variable 取得@item
:
<%= render partial: 'product', object: @item %>
as
:搭配object
使用,可以在 partial 的檔案中透過item
這個 local_variable 取得@item
:
<%= render partial: 'product', object: @item , as: 'item'%>
# 等同於
<%= render partial: "product", locals: { item: @item } %>