iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

Rails 手工打造自己的部落格 系列 第 18

Rails 手工打造自己的部落格 18 - CRUD -D

  • 分享至 

  • xImage
  •  

今天來做刪除,
我們一樣先在 show 裡面做一個刪除的按鈕來
但你有沒有發現 delete 的路徑,怎麼跟 show 一樣?
一方面是易於理解是直接對於哪篇文章做刪除的動作,
一方面也是防止外人用路徑就可以直接做到刪除的效果,

  • 但在連結的部分,就要特別給他一個 method
    才能讓他知道你要對這篇文章做什麼動作,而不是做預設的 GET
  • 然而對於刪除,我們也會希望不要讓他點擊過後就直接動作,
    畢竟刪除是破壞性的操作,如果誤點了的話那不就巴比Q了嗎?
    所以還要做一層確認,這裡就要使用 data confirm來做最後的確認動作,直到真的確認行為了才會執行
<%= link_to '刪除', article_path(@article), method: :delete, data: { confirm: '確定刪除?' } %>

那我們做好按鈕之後,一樣是回到 controller 裡面,把 destroy 的方法給補上

  • 刪除的時候我們應該一樣要給他 @article 的參數,他才會正確的知道我們要刪掉誰,
    但我們之前已經做好這個方法,只需要在,set_article 上面加上 destroy 就可以了。
def destroy
  if @article.destroy
    redirect_to articles_path, notice: '刪除成功'
  else 
    flash[:notice] = '刪除失敗'
    render :show
  end
end

那有沒有人有疑問說,為何 method 是 delete ,但在 controller 裡面就是 destroy ?
這其實也是一堆的慣例所導致的,

對於刪除操作,慣例是在 Controller 中使用 destroy 方法,而不是 delete 方法。這是因為 destroy 方法更符合 RESTful 設計原則,表示刪除資源的操作。
如果你在 Controller 中寫了 delete 方法,而非 destroy 方法,那麼這個方法就不會被 Rails 認為是符合 RESTful 設計的刪除操作。

當你在 view 中使用 link_to 或其他方法設定 method: :delete 時,Rails 會嘗試尋找對應的 destroy 方法來處理刪除。
如果你在 link_to 中寫了 method: :destroy,Rails 不會認識這個方法。
method 參數應該是 HTTP 方法的名稱,如 :delete、:get、:post、:patch 或 :put,而不是 Controller 方法的名稱。


上一篇
Rails 手工打造自己的部落格 17 - CRUD -U
下一篇
Rails 手工打造自己的部落格 - Soft Delete 軟刪除
系列文
Rails 手工打造自己的部落格 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言