Redirect_to / Render / Render Partial

更新於 發佈於 閱讀時間約 5 分鐘
在 Rails 裡常常可以看到 redirect_to 跟 render,但這兩者到底有什麼差異呢?

Redirect_to

redirect_to 後面接網址路徑,是用來轉到該網址路徑去,也就是換到一個新的頁面。
redirect_to 'https://www.google.com/'
如果在 new 的頁面上
if xxx.save
   (略) 
else
  redirect_to 'new_xxxx_path'
end
針對 save false 時執行轉址,會導致在 new 頁面上原本填寫好的資料,全部都消失不見。
因為他是從原本的 A 頁轉到新的 A 頁,所以在原本的 A 頁填好的資料理所當然就不見了。
(同一條溪流,這一秒的水流跟下一秒的水流是不一樣的水流)

Render

只要使用 render 就能解決上述的狀況!
Render 是渲染的意思。
也就是說,render 會渲染指定的畫面,渲染的意思就是原封不動的重新呈現,原本有什麼就給你看什麼。
如果我們把 redirect_to 轉址,改成 render 渲染:
if xxx.save
   (略) 
else
  render :new
end
他就會去渲染 new.html.erb,那只要你在 new 的 view template 畫面上有什麼就渲染什麼,輸入在表格上的資料就不會消失了。
因為不像轉址是到一個全新的頁面。

Render Partial

Render partial 稱為局部渲染,是 render 的其他功能,它可以把每個內容重複的 view template html.erb 進行整合,將重複的內容,整理到一份命名規則為 _xxxx.html.erb 的檔案裡(第一個底線必備)。
通常在 Rails 裡,new 跟 edit 的 html.erb 會有一樣的表格:
/views/article/new.html.erb
<h1>新增</h1>
<%= form_for @article do |form| %>
    ....(略)
<% end %>
/views/article/edit.html.erb
<h1>編輯</h1>
<%= form_for @article do |form| %>
    ....(略)
<% end %>
我們可以把它們重複的部分(表格),整理到 _form.html.erb 然後讓 new.html.erb 跟 edit.html.erb 去渲染 _form.html.erb:
/views/article/_form.html.erb
<%= form_for @article do |form| %>
    ....(略)
<% end %>
/views/article/new.html.erb
<h1>新增</h1>
    
<%= render 'form' %>
/views/article/edit.html.erb
<h1>編輯</h1>
    
<%= render 'form' %>
如此一來便符合 Ruby 的原則:避免重複。

為何稱為局部渲染?

從上面的範例可以知道,new 跟 edit 並不是把自己所有的畫面都渲染了,而是保留了各自不同的部分:
<h1>新增</h1>
<h1>編輯</h1>
並渲染了局部重複的部分:
<%= form_for @article do |form| %>
    ....(略)
<% end %>

Render Partial 彈性大增

在 render partial 的功能裡,還能夠替每個需要的 html.erb 進行渲染客製化,增加渲染的彈性。
/controller/articles_controller.rb
def create
    @article = Article.new(article_params)
    (略)
end
/views/article/_form.html.erb
<%= form_for article do |form| %>
    ....(略)
<% end %>
/views/article/new.html.erb
<h1>新增</h1>
    
<%= render 'form', article = @article %>
/views/article/edit.html.erb
<h1>編輯</h1>
    
<%= render 'form', article = @article %>
將 render 後面多加一個區域變數,並讓實體變數指向該區域變數,用這個實體變數指向區域變數的方法,好讓每個局部渲染的畫面,都能再另外客製化各自需要的東西。
在 class 裡的 action 底下製作需要的實體變數,然後指向區域變數。
avatar-img
1會員
13內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Mike的沙龍 的其他內容
Find 輸入一個 id 參數後,尋找相對應的一筆資料。 在 SQL 的部分: 如果 find 找不到相對應的資料時,會跳出兇殘的錯誤訊息: Find_by 輸入一個或多個參數後,找到相對應的一筆資料。 在 SQL 的部分: Where 輸入一個或多個參數後,找到相對應的多筆資料。
避免使用者在資料寫入時,強行新增非官網的資料時,所進行的預設阻擋功能。 所以必須新增一個「白名單」,才能正常寫入: 寫了這段後,除了 permit 的資料,其他額外的資料都會被過濾掉,不會進來。
MVC是一套網頁開發的架構流程,代表著從前端到後端的各自分工。 M: Model 多個 model 建立的 tables 們能夠透過 foreign_key 或是 belongs_to / has_one / has_many,將彼此的資料產生關聯。 V: View C: Controller
直接來看範例吧
  一切的重點就是在利用文字排版與語言解構使程式碼more「readable」   範例如下列網址,有興趣深入了解可進去觀看
1. p1 = Product.new(name:"衛生紙") 接著執行 p1.stores = s1 卻出現 undefined method "each"的錯誤訊息。(如下圖一) 解決方法: 強制給實體掛上store_id 接下來處理Product
Find 輸入一個 id 參數後,尋找相對應的一筆資料。 在 SQL 的部分: 如果 find 找不到相對應的資料時,會跳出兇殘的錯誤訊息: Find_by 輸入一個或多個參數後,找到相對應的一筆資料。 在 SQL 的部分: Where 輸入一個或多個參數後,找到相對應的多筆資料。
避免使用者在資料寫入時,強行新增非官網的資料時,所進行的預設阻擋功能。 所以必須新增一個「白名單」,才能正常寫入: 寫了這段後,除了 permit 的資料,其他額外的資料都會被過濾掉,不會進來。
MVC是一套網頁開發的架構流程,代表著從前端到後端的各自分工。 M: Model 多個 model 建立的 tables 們能夠透過 foreign_key 或是 belongs_to / has_one / has_many,將彼此的資料產生關聯。 V: View C: Controller
直接來看範例吧
  一切的重點就是在利用文字排版與語言解構使程式碼more「readable」   範例如下列網址,有興趣深入了解可進去觀看
1. p1 = Product.new(name:"衛生紙") 接著執行 p1.stores = s1 卻出現 undefined method "each"的錯誤訊息。(如下圖一) 解決方法: 強制給實體掛上store_id 接下來處理Product
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
不論是 Astra、Blocksy 還是 Kadence 佈景主題,都有內建頁首與頁尾編輯器,你可以在外觀自訂器中以所見即所得的方式新增各種元素,像是選單、按鈕及社群圖示。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
Vue Router 及 具名視圖,擺脫以往切換依賴 CSS display:none 跟 display:block 互相配合,有時還得搭配 z-index 來調整層級跟 opacity 透明度的麻煩,而 Vue Router 完美的解決了這棘手的問題,且能客製頁面想要呈現的擺飾。
※ Javascript和HTML的關係 當我們輸入新的網址或按下重新整理時,從解析檔案到畫面顯示出來,瀏覽器會進行以下流程: 解析 HTML / CSS 檔案,建立物件模型: HTML → DOM (Document Object Model)。 CSS → CSSOM (CSS Obje
Thumbnail
CSR(Client Side Rendering)是一種將渲染資料的過程交由瀏覽器端處理的方法。
Thumbnail
伺服器端渲染(SSR)是一種在伺服器端渲染 HTML 頁面的技術。
Thumbnail
本文介紹了 Django 專案中各個檔案的用途,包括 settings.py、tests.py、models.py 等。並且解釋了 MTV 架構的後端運作流程,以及相對應的範例介紹。閱讀本文可幫助讀者更好地瞭解 Django 後端開發。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
不論是 Astra、Blocksy 還是 Kadence 佈景主題,都有內建頁首與頁尾編輯器,你可以在外觀自訂器中以所見即所得的方式新增各種元素,像是選單、按鈕及社群圖示。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
Vue Router 及 具名視圖,擺脫以往切換依賴 CSS display:none 跟 display:block 互相配合,有時還得搭配 z-index 來調整層級跟 opacity 透明度的麻煩,而 Vue Router 完美的解決了這棘手的問題,且能客製頁面想要呈現的擺飾。
※ Javascript和HTML的關係 當我們輸入新的網址或按下重新整理時,從解析檔案到畫面顯示出來,瀏覽器會進行以下流程: 解析 HTML / CSS 檔案,建立物件模型: HTML → DOM (Document Object Model)。 CSS → CSSOM (CSS Obje
Thumbnail
CSR(Client Side Rendering)是一種將渲染資料的過程交由瀏覽器端處理的方法。
Thumbnail
伺服器端渲染(SSR)是一種在伺服器端渲染 HTML 頁面的技術。
Thumbnail
本文介紹了 Django 專案中各個檔案的用途,包括 settings.py、tests.py、models.py 等。並且解釋了 MTV 架構的後端運作流程,以及相對應的範例介紹。閱讀本文可幫助讀者更好地瞭解 Django 後端開發。