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

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

詳細はこちら
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

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回答

1684閲覧

Ajaxでセレクトボックスを作りたい

goriwo

総合スコア17

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

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クリップ

投稿2021/03/25 03:24

編集2021/03/25 04:50

イメージ説明

前提・実現したいこと

筋トレアプリ作成中で以下のようにしたいです
部位ごとに選択したらDBからちがう種目がでるようにしたいです
胸ーベンチ、フライ
背中ーデット、懸垂
脚ースクワット、プレス

該当のソースコード

js

1function check() { 2 let select = document.querySelector("#part"); 3 4 select.addEventListener('change',() => { 5 const valueName = document.getElementById('part').value; 6 const XHR = new XMLHttpRequest(); 7 XHR.open("GET",`/muscle_events/${valueName}`,true); 8 XHR.responseType = "json"; 9 XHR.send(); 10 XHR.onload = () => { 11 const events = XHR.response.events 12 debugger 13 const eventSelect = document.getElementById('event') 14 const option = document.createElement('option') 15 16 eventSelect.appendChild('option') 17 18 } 19 }) 20} 21 window.addEventListener("turbolinks:load", check); 22

Controller

1class MuscleEventsController < ApplicationController 2 def index 3 @muscle_events = MuscleEvent.all 4 end 5 6 def get_menu 7 events = MuscleEvent.where(part:params[:id]) 8 render json:{ events: events} 9 end 10end

viwes

1<script src="select.js"></script> 2<p>どこの部位を筋トレしますか?</p> 3<%= form_with url:"root_path" do |f| %> 4 <%= f.select :part, MuscleEvent.parts.keys.map{|k| [I18n.t("enums.muscleevent.parts.#{k}"), k]} %> 5 <%= f.select :event,{} %> 6<% end %>

試したこと

def get_menu events = MuscleEvent.where(part:params[:id]) render json:{ events: events}
pry(#<MuscleEventsController>)> MuscleEvent.where(part:params[:id]) MuscleEvent Load (0.6ms) SELECT `muscle_events`.* FROM `muscle_events` WHERE `muscle_events`.`part` = 2 ↳ app/controllers/muscle_events_controller.rb:8:in `get_menu' => [#<MuscleEvent:0x00007f8c7547ed08 id: 4, part: nil, event: "デットリフト", created_at: Sun, 21 Mar 2021 19:27:21 UTC +00:00, updated_at: Sun, 21 Mar 2021 19:27:21 UTC +00:00>, #<MuscleEvent:0x00007f8c754b4728 id: 5, part: nil, event: "懸垂", created_at: Sun, 21 Mar 2021 19:27:21 UTC +00:00, updated_at: Sun, 21 Mar 2021 19:27:21 UTC +00:00>, #<MuscleEvent:0x00007f8c754b4660 id: 6, part: nil, event: "ラットプルダウン", created_at: Sun, 21 Mar 2021 19:27:21 UTC +00:00, updated_at: Sun, 21 Mar 2021 19:27:21 UTC +00:00>]

ここまではおくれているのでJSONデータから属性やプロパティを設定がいまいちわかりません
初心者なのでわかりやすく教えてもらえるとありがたいです
このDBからpartが1ならベンチプレス、ダンベルプレス、ダンベルフライとでるように

1 1 ベンチプレス 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 2 1 ダンベルプレス 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 3 1 ダンベルフライ 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 4 2 デットリフト 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 5 2 懸垂 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 6 2 ラットプルダウン 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 7 3 スクワット 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 8 3 レックプレス 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 9 3 レックカール 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 10 4 フロントレイズ 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 11 4 サイドレイズ 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 12 4 リアレイズ 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 13 5 バーベルカール 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 14 5 スカルクラッシャー 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 15 5 ハンマーカール 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 16 6 腹筋 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 17 6 ドラゴンフラッグ 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 18 7 ウォーキング 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 19 7 ランニング 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249 20 8 首 2021-03-21 19:27:21.095249 2021-03-21 19:27:21.095249

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

yambejp

2021/03/25 03:29

返ってくるJSONデータサンプルを例示できますか?
goriwo

2021/03/25 04:04

events 0: {id: 4, part: null, event: "デットリフト", created_at: "2021-03-21T19:27:21.095Z", updated_at: "2021-03-21T19:27:21.095Z"} 1: {id: 5, part: null, event: "懸垂", created_at: "2021-03-21T19:27:21.095Z", updated_at: "2021-03-21T19:27:21.095Z"} 2: {id: 6, part: null, event: "ラットプルダウン", created_at: "2021-03-21T19:27:21.095Z", updated_at: "2021-03-21T19:27:21.095Z"} length: 3 __proto__: Array(0) これのことでしょうか?
FKM

2021/03/25 04:32 編集

そのテーブルじゃきついんでは…。 部位マスタに対して、イベント用のトランザクションを作りたい場合は、そのトランザクションに部位マスタを参照して紐付けないとだめですよ。
goriwo

2021/03/25 04:41

ほんとですか。。。 デットリフト、懸垂、ラットプルまで持って来れたのにうまくいかないものなのですね となるとテーブルの作り直しからでしょうか?
FKM

2021/03/25 04:43

テーブル設計図あります?一つ付け加えるだけで対応できますけどね。
m.ts10806

2021/03/25 04:47

Ruby on Rails を質問タグとして追加してください
FKM

2021/03/25 04:49

左端の番号は行数じゃなくてidですかね?だったら準備はできてます。なので、部位マスタから紐付けて対象となるデータでプルダウンメニューを作るようにすればいいのではないかなと?
goriwo

2021/03/25 04:57

左端はIDです 部位(partカラム)をenumで番号で指定してます それはAjaxでできるでしょうか?
FKM

2021/03/25 05:00

取得した値をパーシャルでプルダウンメニューを作ってからテンプレートに代入していけば行けると思います <%= f.select :event,{} %> ここを代わりにパーシャルにすればいいのでは?
goriwo

2021/03/25 11:06

意見ありがとうございます とりあえずはベストアンサーの方で頑張ってみます お手数おかけしました
guest

回答1

0

ベストアンサー

post/getによる絞り込みはAPI側でやってください

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 document.querySelector('#part').addEventListener('change',e=>{ 4 const event=document.querySelector('#event'); 5 event.innerHTML=""; 6 if(e.target.value!==""){ 7 var params=new URLSearchParams(); 8 params.append('part',e.target.value); 9 const url="・・・?"+params.toString(); 10 fetch(url).then(res=>res.json()).then(data=>{ 11 data.forEach(x=>{ 12 event.appendChild(Object.assign(document.createElement('option'),{value:x.event,textContent:x.event})); 13 }); 14 }); 15 } 16 }); 17 18}); 19</script> 20<div>部位</div> 21<select id="part"> 22<option value="">---</option> 23<option value="胸"></option> 24<option value="背中">背中</option> 25<option value="脚"></option> 26</select> 27<select id="event"> 28</select> 29</div>

投稿2021/03/25 05:02

編集2021/03/25 05:20
yambejp

総合スコア116694

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

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

goriwo

2021/03/25 11:04

なんども質問すみません post/getによる絞り込みはAPI側というのは var params=new URLSearchParams(); ここの()の部分と const url="・・・?"+params.toString(); ・・・?の所という理解でよろしいでしょうか?
yambejp

2021/03/26 00:06

パラメータを渡すと、該当するデータだけサーバー側から出力されるのですよね? その作業のことです
goriwo

2021/03/26 10:40

そうですね パラメーターで胸(1)を渡すと(1)に該当するデータをサーバー側から出力させたいです
yambejp

2021/03/26 10:42

ごめんなさいrubyのapiは専門外なので、GETでpartパラメータを受けたときに 当該データのみJSONにして返すような仕組みを書いてください
goriwo

2021/03/26 11:18

const url= ("GET",params.toString()); url.responseType = "Json"; url.send(); このような理解でただしいでしょうか?
yambejp

2021/03/26 12:11

ruby側の疑問は別途ruby専用で質問を立てるとよいでしょう 私はphperなのでお役に立てません
goriwo

2021/03/26 12:26

了解です! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問