###AjaxでquerySelectorAllメソッドを使いデータ一覧でレコードをクリックすると打ち消し線が表示されるようにしたが、他のページではクリック発火させたくない。
現在、一覧ページでレコードが一覧になって表示されています。その画面上で、レコードをクリックすると、打ち消し線が表示されるように実装しました。
●●querySelectorAllメソッドを使い、クラスを指定しデータ全てを選択し、その後forEachで一つずつを取り出し、それぞれにクリックで発火するように設定しています。●●
■■index.html.erbでのみ、このイベントを発火させたいです。しかし、他のページでも打ち消し線の表示は生かしたいです。■■
発生している問題・エラーメッセージ
foodModel
1lass CreateFoods < ActiveRecord::Migration[6.0] 2 def change 3 create_table :foods do |t| 4 t.string :food_name, null: false 5 t.string :product_name 6 t.integer :category_id, null: false 7 t.date :purchase_date, null: false 8 t.date :sell_by 9 t.string :shop 10 t.references :refrige, foreign_key: true 11 t.boolean :checked 12 t.timestamps 13 end 14 end 15end 16
t.boolean :checkedで、checkedがtrue,falseで表示が変わるようにしています。
checkedJs
1function check() { 2 const foods = document.querySelectorAll(".food"); 3 // querySelectorAllメソッドで、foodをクラス名にもつ要素を取得できる 4 // views/foods/index.html.erbのfood部分のブロックをクリックした時にイベントを発火させたい 5 foods.forEach(function (food) { 6 food.addEventListener("click", () => { // 要素1つずつに対して、「クリック」した際に動作する処理を記述 7 // ↓ここにクリックした時に行う「何らかの処理」を記述していく 8 9 const foodId = food.getAttribute("data-id"); 10 const XHR = new XMLHttpRequest(); 11 XHR.open("GET", `/foods/${foodId}`, true); // open どんなリクエストをするのかを指定するメソッド// HTTPメソッドの指定,パスの指定,非同期通信のON/OFF 12 XHR.responseType = "json"; 13 XHR.send(); 14 // ↑ここまでクリックした時に行う「何らかの処理」を記述していく 15 16 17 // ↓ここからレスポンシブがあがあった場合の処理 18 XHR.onload = () => { 19 // レスポンスがエラーだった場合の処理 20 if (XHR.status != 200) { 21 alert(`Error ${XHR.status}: ${XHR.statusText}`); 22 return null; // return null;によってJavaScriptの処理から抜け出すことができます。 23 } 24 // onloadはレスポンスなどの受信が成功した場合の処理 25 const item = XHR.response.food;// checkedアクションで返却したitemは、XHR.response.foodで取得できる 26 if (item.checked === true) { 27 food.setAttribute("data-check", "true"); // data-checkの属性値にtrueをセット 28 } else if (item.checked === false) { 29 food.removeAttribute("data-check");// data-checkは属性ごと削除 30 } 31 }; 32 // ↑ここまでレスポンシブがあがあった場合の処理 33 }); 34 }); 35} 36window.addEventListener("load", check);
index
1 <div class="page_right"> 2 <div class="in_index"> 3 <div class="index-food"> 4 <div class="refrige_right"> 5 <%= link_to @refrige.refrige_name, edit_refrige_path(@refrige.id) %> 6 </div> 7 </div> 8 <div class="sabu_index_food"> 9 <div class="index_scroll"> 10 <table class="food_table"> 11 <th>食材名</th> 12 <th>商品名</th> 13 <th>カテゴリー</th> 14 <th>購入日</th> 15 <th>賞味期限</th> 16 <th>購入店</th> 17 </tr> 18 <% @foods.each do |food| %> 19 <tr class="food" data-id=<%= food.id %> data-check=<%= food.checked %>> 20 <td class="food_name" id="lists" > <%= food.food_name %></td> 21 <td class="product_name" id="lists"><%= food.product_name %></td> 22 <td class="category" id="lists"><%= food.category.name %></td> 23 <td class="purchase_date" id="lists"><%= food.purchase_date %></td> 24 <td class="sell_by" id="lists"><%= food.sell_by %></td> 25 <td class="shop" id="lists"><%= food.shop %></td> 26 </tr> 27 <% end %> 28 </table> 29 </div> 30 </div> 31 </div> 32 </div> 33</div>
検索ページでは打ち消し線の表示はあるが、クリック発火は無しにしたいです。
試したこと
<% @foods.each do |food| %>
<tr class="food" data-id=<%= food.id %> data-check=<%= food.checked %>>
検索ページではクラス名をfoodsに変えてみました。そうしたら、思った表示になりましたが、Herokuにアップしたらエラーとなってしまいました????
補足情報(FW/ツールのバージョンなど)
初心者です。わかりにくい点などございましたら追記させていただきます。
解決策ございましたら、回答お願いいたします????♀️
回答1件
あなたの回答
tips
プレビュー