削除機能を実装
削除機能を実装していきましょう!
システム周りはこれが最後ですね
まずはコントローラーのdestroyメソッドを編集
def destroy
@content = Content.find(params[:id])
@content.destroy
redirect_to @content, status: :see_other
end
では解説
1行目
ここは今までもやりましたね
削除する対象のContentのIDを取得します
2行目
取得したIDのContentを削除します
3行目
削除したらTOPページ(index.html.erb)に飛ばします
TOPページに飛ばすなら
redirect_to contents_pathで良くね?
って思われるかと思います
実は後半の「status: :see_other」がめちゃくちゃ大事です
これについては後述します
では放置していた削除ボタンを編集しましょう
index.html.erbの削除ボタンは
<%=link_to "削除", content_path(content), data: { turbo_method: 'delete', turbo_confirm: '削除していいですか?' }, class: 'btn-delete btn btn-danger' %>
show.html.erbの削除ボタンは
<%=link_to "削除", content_path(@content), data: { turbo_method: 'delete', turbo_confirm: '削除していいですか?' }, class: 'btn-delete btn btn-danger' %>
コードについて解説します
link_toで削除対象ContentのIDにアクセスするようにしてます
この部分ですね(index.html.erb)
content_path(content)
そして今回はアクセスと言っても取得したIDのContentのViewに行くわけではなく、データベースにアクセスします
そしてこれで
data: { turbo_method: 'delete', turbo_confirm: '削除していいですか?' }
削除をします
turbo_confirm: '削除していいですか?'
はオプションです
なくてもいいですけど間違えて削除を防止します
これがあることで削除ボタンを押した時に
のようになります
turboメソッドについて
turboメソッドと言ってこれを使うことでJavaScriptの簡易的な命令を実行出来ます
turboを使って削除するときは必ずdestroyメソッドのリダイレクトに「status: :see_other」をつけてください
「status: :see_other」が無いと
- 違うものが削除される場合がある
- show.html.erb(詳細画面)から削除を実行した際に迷子になる
ということがあげられます
1つ目はもう読んでて明らかにやばいことですねw
2つ目ですがこれ記載せずにshow.htmlから削除した場合
みたいにエラーが出ます
なんでTOPにリダイレクトさせてるのに!?
って思うでしょう
この質問は多く頂きます
削除してからもその詳細画面に残ろうとします
そしてその時にshowメソッドが発動してエラーが起きるんです
ですからこの「status: :see_other」で迷子にならないようにします
詳しく説明をすると今の段階だとわけが分からなくなります
ですから今は形として覚えてください
リピートアフターミー
turboを使って削除するときは必ずdestroyメソッドのリダイレクトに「status: :see_other」をつける!
メニューをつけて便利に
さてシステムは完成したので今度は使いやすくしていきます
新規作成に行ったりTOPに戻ったりするのに今はURLを打ち込んでますよね
1,2回なら許せますがこれが毎回起こると二度とこのメモなんて使いません
というわけでメニューバー的なのを作ってリンクを貼りましょう
どの画面からでもメニューバーが見れるようにしたいので
app/views/layouts/application.html.erb
を編集しましょうか
BootStrapを読み込ませたファイルですね
ここを編集します
<div class='mainContentView col-sm-8 offset-sm-2'>
# この2行を追加
<%= link_to 'TOP', contents_path, class: 'btn btn-primary' %>
<%= link_to 'Add', new_content_path, class: 'btn btn-primary' %>
<%= yield %>
</div>
これでOK
TOPはindex.html.erbに飛ぶように
Addはnew.html.erbに飛ぶように
一応ルーティングを確認しておきましょうか
熱い、熱い忘れ物
ごめんなさい、一個忘れてました・・・。
TOPのメモ一覧を見てください
更新時間が表示されますが時間がおかしいですよね
日本の時間では無いのでこれを日本時間に合わせます
config/application.rbを開いてください
module Memo
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.0
# Configuration for the application, engines, and railties goes here.
#
# These settings can be overridden in specific environments using the files
# in config/environments, which are processed later.
#
# config.time_zone = "Central Time (US & Canada)"
# config.eager_load_paths << Rails.root.join("extras")
# これを追加
config.time_zone = 'Tokyo'
end
end
サーバーを再起動して確認してください
時間が正しく表示されてるはずです
最終動作確認
では各自最終動作確認をお願いします
やってほしいことは
- サーバーを起動してindex.html.erbにアクセスしているか
- メニューボタンのAddから新規作成画面に飛べるか
- 新規作成画面からContentを作成できるか
- 「保存」を押したら新規作成したメモの詳細ページ飛べるか
- 詳細ページから編集で内容を書き換えて保存できるか
- 詳細ページから削除ができるか
- もう一つ新規作成してTOPページから削除ができるか
- これをお願いします
次回、サーバーへアップロード
いよいよ最終回です
せっかく作ったものですからどこかにアップしてみんなに使ってもらえるようにしましょう
今回はサンプルのアプリですがご自身でなにか作った時にアップロードする方法を学びます
ここまで本当にお疲れさまでした