今天來做刪除,
我們一樣先在 show 裡面做一個刪除的按鈕來
但你有沒有發現 delete 的路徑,怎麼跟 show 一樣?
一方面是易於理解是直接對於哪篇文章做刪除的動作,
一方面也是防止外人用路徑就可以直接做到刪除的效果,
method
,data confirm
來做最後的確認動作,直到真的確認行為了才會執行<%= link_to '刪除', article_path(@article), method: :delete, data: { confirm: '確定刪除?' } %>
那我們做好按鈕之後,一樣是回到 controller 裡面,把 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 方法的名稱。