🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1173閲覧

AjaxでquerySelectorAllメソッドを使いデータ一覧でレコードをクリックでイベント発火させた。他のページではクリック発火したくない。

kao.

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/12/14 11:46

編集2020/12/14 13:59

###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/ツールのバージョンなど)

初心者です。わかりにくい点などございましたら追記させていただきます。
解決策ございましたら、回答お願いいたします????‍♀️

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

no1knows

2020/12/16 22:43

この問題はもうかいけつしていますか?
kao.

2020/12/17 04:58 編集

連絡いただきありがとうございます。すいません、回答がつかなかったので、他の方法を考え実装中です。解決はしていませんが、今回はこちらの実装はやめました????‍♀️ 今後の勉強に、解決策がございましたら提案いただけると嬉しいです。
guest

回答1

0

ベストアンサー

クラス名を変えた事で解決するかもしれません。

個人的には同じ内容であれば、indexページだけクラス名を変えるといったことはせず、使い回すのが良いかと思います。

僕なら、bodyやdivなどのIDClassに、controller.controller_namecontroller.action_nameを設定し、その値を見てJSを実行する・しないといった方針で実装するかと思います。


説明不足ですいません。。。具体的には

Ruby

1<body id="<%= controller.controller_name %>" class="<%= controller.action_name %>">

と設定しておき、下記で条件分岐を行う形です。

JavaScript

1if( document.body.id == 'foods' && document.body.classList.contains('index')){ 2: // foodコントローラーのindexアクションのみで実行されるJavaScript 3}

投稿2020/12/17 06:01

編集2020/12/20 23:03
no1knows

総合スコア3365

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kao.

2020/12/18 09:14

ご回答ありがとうございます!controller.controller_name、controller.action_nameでコントローラー名やアクション名で条件分岐ができるのですね。知りませんでした。ビューのヘルパーメソッドとのことですが、今回の場合だとどのように使いますか? 教えていただけると嬉しいです????‍♀️
no1knows

2020/12/19 00:30

> index.html.erbでのみ、このイベントを発火させたいです。 とのことなので、下記のようにして利用します。 > bodyやdivなどのIDやClassに、controller.controller_nameやcontroller.action_nameを設定し、その値を見てJSを実行する・しないといった方針で実装する
kao.

2020/12/20 12:44

ありがとうございます。知識がなさすぎてわかりません???? no1knowsさんの情報を元に、自分でもしっかり調べてみます。ありがとうございました!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問