Rails 中的 public 檔案與捕捉例外

Posted by Anthony Chao on 2019-09-24

public 檔案 (ex. 404 / 500 )

今天講到這篇的第 14 章

大家一定有經驗看到 404 Not Found 這幾個大字在你的螢幕上出現吧,我們今天要講的就跟這有關!

在 Rails 的系統中預設,如果有個遠端的 request 過來,但依循路徑找不到指定的網頁,會出現 “404 Not Found” 的頁面,如果是其他錯誤則會出現 “500 Server Error” 的頁面

那麼這些頁面藏在哪裡呢?請看下圖~

燈燈!答案揭曉!他們就藏在專案的 public 資料夾裡面

既然他們本身是檔案,表示你也可以客製化這些頁面的內容,讓別人進來你頁面找不到內容時不再是醜醜的 404 not found 幾個字而已了!


直接在網址加上 404 檔案的路徑可以直接連到頁面,不用更改 routes 檔案喔!也可以更改檔案裡面的內容

另外,在 public 資料夾的檔案有個特性是,不需要路徑設定就可以顯示出內容,為什麼要這樣設計呢?

想想以下情境:如果今天有個人要找頁面找不到,伺服器請他去找 404 頁面,結果又因為沒有設定 404 的路徑,又再次找不到頁面,伺服器又再請他去找 404 頁面… 這樣不就陷入了無窮迴圈了!?因此在 public 資料夾內的檔案才會設計成不需要路徑設定也能顯示內容!


Rescue

我們也可以盡量不讓這種伺服器錯誤發生,對可以預期到的錯誤或例外先捕捉做處理

使用的方式是把出現的錯誤訊息放在 rescue_from 後面,然後把要做的事情放在 with 這個 option 後面

1
2
3
4
5
6
7
8
9
10
#application_controller.rb
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordNotFound, with: :not_found_site

private
def not_found_site
render plain: "404 Not Found",
status: :not_found
end
end

在這例子中,使用一個方法接在 with 後面,除了方法外也是可以使用 Proc 喔!

參考資料:

Rails Guide





prevent_hack