非同期でフォームから選択すると、画面上に表示されるデータがid番号になってしまい、文字列が表示されません。。。
collection_selectで選択するデータをActiveHashを使い、モデルへ記述しているため、javascriptではidしか取得できていない状態になっています。どのようにしたらcategoryモデルからname:を持って来れるでしょうか。
●●非同期のビュー上にidではなく、肉類、魚介類などと出力したいです●●
記述コード
categoryModel
1class Category < ActiveHash::Base 2 self.data = [ 3 { id: 1, name: '--' }, 4 { id: 2, name: '肉類'}, 5 { id: 3, name: '魚介類'}, 6 { id: 4, name: '乳製品類'}, 7 { id: 5, name: '卵類'}, 8 ] 9 include ActiveHash::Associations 10 has_many :articles 11end
newViws
1 <%= form_with model: [@refrige, @food], url: refrige_foods_path, method: :post,id: "form" do |f|%> 2 <%#エラーメッセージを表示させる記述が必要 Ajaxなのでアラートでエラーメッセージ表示%> 3 <table class="form-table"> 4 <thead> 5 <tr> 6 <th>食材名 (必須)</th> 7 <th>商品名 </th> 8 <th>カテゴリー (必須)</th> 9 <th>購入日(必須)</th> 10 <th>賞味期限(必須)</th> 11 <th>購入店 </th> 12 </tr> 13 </thead> 14 <tbody class="bulk-registration-field"> 15 <tr class="item" data-id=<%= @refrige.id%> id=new_food data-check=<%= @food.checked %>> 16 <td> 17 <%= f.text_field :food_name, id: "food_name", class: 'form-control'%> 18 </td> 19 <td> 20 <%= f.text_field :product_name, id: "product_name", class: 'form-control'%> 21 </td> 22 <td> 23 <%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:'form-control', id:"category_id"}) %> 24 </td> 25 <td> 26 <%= f.date_field :purchase_date, id: "purchase_date", class: 'form-control'%> 27 </td> 28 <td> 29 <%= f.date_field :sell_by, id: "sell_by", class: 'form-control' %> 30 </td> 31 <td> 32 <%= f.text_field :shop, id: "shop", class: 'form-control'%> 33 </td> 34 </tr> 35 </tbody> 36 </table> 37 </div> 38 <div class="text-center"> 39 <%# <%= form.submit '食材をまとめて追加', class: 'btn-btn-primary' %> 40 <%= f.submit '食材を追加', class: 'btn-btn-primary',id: "food_submit" %> 41 </div> 42 <% end %> 43 <div class="java_food"> 44 <div id="list"> 45 </div> 46 </div>
foodJs
1function food() { 2 const submit = document.getElementById("food_submit"); 3 const newFood = document.getElementById("new_food"); 4 5 submit.addEventListener("click", (e) => { 6 const refrigeId = newFood.getAttribute("data-id") 7 const formData = new FormData(document.getElementById("form"));// メモ投稿のフォームに入力された情報をidで取得 8 const XHR = new XMLHttpRequest(); 9 XHR.open("POST", `/refriges/${refrigeId}/foods `, true); 10 XHR.responseType = "json"; 11 XHR.send(formData); 12 13 14 XHR.onload = () => { 15 if (XHR.status != 200) { 16 alert(`Error ${XHR.status}: ${XHR.statusText}`); 17 return null; 18 } 19 const item = XHR.response.food; 20 const list = document.getElementById("list"); 21 const nameText = document.getElementById("food_name"); 22 const productText = document.getElementById("product_name") 23 const categoryText = document.getElementById("category_id") 24 const purchaseText = document.getElementById("purchase_date") 25 const sellText = document.getElementById("sell_by") 26 const shopText = document.getElementById("shop") 27 // もしitemが存在しない場合→ 28 if (item.id == null) { 29 alert(`食材名・カテゴリー・購入日・賞味期限 の記入をしてください`); 30 return null; 31 }else{ 32 // ↓もしitemが存在する場合 33 const HTML = ` 34 35 <table class="food_table"> 36 <tr class="item"> 37 <td class="food_name"> 38 ${item.food_name} 39 </td> 40 <td class="product_name"> 41 ${item.product_name} 42 </td> 43 <td class="category_id"> 44 ${item.category_id} 45 </td> 46 <td class="purchase_date"> 47 ${item.purchase_date} 48 </td> 49 <td class="sell_by"> 50 ${item.sell_by} 51 </td> 52 <td class="shop"> 53 ${item.shop} 54 </td> 55 </tr> 56 </table>`; 57 list.insertAdjacentHTML("afterend", HTML); 58 nameText.value = ""; 59 productText.value = ""; 60 shopText.value = ""; 61 purchaseText.value = null; 62 sellText.value = null; 63 categoryText.value = "1"; 64 }; 65 } 66 e.preventDefault(); 67 // 標準設定されている(Default)イベントを阻止する(prevent)メソッド二重で処理が重ならないよう。リロードした時にcreateアクションのみしてもらうようにする。 68 }); 69} 70window.addEventListener("load", food);
def create food = Food.new(food_params) food.save if food.valid? render json: { food: food } end private def food_params params.require(:food).permit(:food_name, :product_name, :category_id, :purchase_date, :sell_by, :shop).merge(refrige_id: params[:refrige_id], checked: false) end
試したこと
jsファイルに${item.category.name}にしてみましたが、やはりダメでした。。。
create の時点でidしか持ってこれていません。
補足情報(FW/ツールのバージョンなど)
初心者です、わかりにくければ追記いたします。どなた分かりますでしょうか?
どうぞよろしくお願いします????♀️
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。