前提・実現したいこと
rails6にてtodoアプリを作っています。javascriptにて、クリックした要素からidを取得し、それに紐付けられた親要素を削除する機能を実装しています。javascriptの動作自体は望んだ通りに動いて、要素の削除も行えます。しかし、ページを更新すると元に戻ってしまいます。ビューファイルでeachメソッドを使って要素を生成している以上、ページが更新された時に元通りになるというのは分かります。railsに備わっているdestroyアクションで消せば良いのではと思いますが、事情があってデータの削除はしたくありません。そこで、何か良い方法がないか教えて頂けると幸いです。
発生している問題・エラーメッセージ
赤枠と青枠の部分はそれぞれeachメソッドを使用して保存されているデータを表示しています。今回は、赤枠の部分の要素は消えても、青枠の部分の要素は残っていて欲しい(つまり赤枠部分の処理ではデータ自体を消したくなくて、データを消すなら青枠内の削除ボタンを押して削除する)ということです。
該当のソースコード
赤枠に表示させている部分(index.html.erb)
<% d = Date.today%> <div class="countdown"> <div class="todo-countdown"> <% @events.each do |event| %> <% if event.category_id == 2 && d <= event.event_date %> <% cut_day = "#{event.event_date - d}" %> <% cut_day_num = cut_day.length - 2%> <% last_day = cut_day.slice(0, cut_day_num).to_i %> <% if last_day <= 3 %> <div class="countdown-zone-red" id="box_todo_id_<%= event.id %>" > <div class="countdown-zone-date"> <%= "残り #{last_day} 日!"%> </div> <div class="countdown-zone-title"> <%= event.title %> </div> <div class="done-box" id="todo_id_<%= event.id %>"> <div class="done-zone"> Done! </div> </div> </div> <% end %> <% end %> <% end %> </div> </div>
ややこしいので、each do以降の記述について、少し説明させて頂きます。まず、1つ目のifで『category_idの値が「2」であるか(予定は「1」、todoは「2」で設定しています。todoのみ表示させるためにこの記述をしています)』『現在より未来のtodoであるか』という条件分岐をしています。次のifで「todoの日付ー今日の日付」が14日以内であるか」という条件分岐をしています。
そして、要素を特定するために親要素(削除したい要素)、子要素(クリックイベントを起こしたい子要素)にevent.idを利用してそれぞれ唯一のidを指定しています(親要素のidは"box_todo_id_<%= event.id %>"で、子要素のidは"todo_id_<%= event.id %>"となっていて、少し違います)
青枠部分のコードは直接関係なさそうなので、割愛させて頂きます。(必要あれば言ってください)
続いてJavascriptファイル(countdown.js)のコードです
window.addEventListener('load', function(){ const todo_num = document.querySelector('.done-box').id; const box_num = "box_" + todo_num; const target = document.getElementsByClassName('done-box'); for(let i = 0; i < target.length; i++){ target[i].addEventListener('click', (event) => { if (document.querySelector('.countdown-zone-red').id === box_num ) { console.log(target[i].id); const delete_box = document.getElementById('box_' + target[i].id); if(window.confirm('完了しても良いですか?')) { delete_box.remove(); } } }, false); } })
考えられる仮説
現在category_idはActiveHashにて管理しています。
class Category < ActiveHash::Base self.data = [ { id: 1, name: '予定' }, { id: 2, name: 'Todo' }, ] end
これを
class Category < ActiveHash::Base self.data = [ { id: 1, name: '予定' }, { id: 2, name: 'Todo' }, { id: 3, name: '完了ずみTodo' }, ] end
などとすると、条件分岐で上手いこと赤枠・青枠に表示できると考えています。したがって、もし、javascriptでカラム(category_id)の値を'2'→'3'に変更して保存できるような方法があれば教えて頂きたいです。そして、javascriotを用いなくても処理はできると思いますが、「Done!」ボタンを押した時に付箋をベリっと剥がすようなモーションをどうしても付けたいので、cssを工夫すればできるよなどと言った情報でも構いません。現在このアプリは同時にデプロイしているので、DBはあまり触りたくないという気持ちが正直な所で、この方法を試せずにいます。良い方法があれば、ご教授ください。よろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
Raisのバージョン 6.0.0
必要な情報あれば遠慮なくお伝えください。
回答2件
あなたの回答
tips
プレビュー