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

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

詳細はこちら
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回答

1394閲覧

Ajaxを使ってデータ保存する際、collection_selectで選択したデータがid番号のままビューに表示されてしまいます。

kao.

総合スコア2

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/18 09:51

編集2020/12/18 10:00

非同期でフォームから選択すると、画面上に表示されるデータが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/ツールのバージョンなど)

初心者です、わかりにくければ追記いたします。どなた分かりますでしょうか?
どうぞよろしくお願いします????‍♀️

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

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

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

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

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

guest

回答1

0

自己解決

解決できました!
js上にデーターがないということは、サーバーサイドの状態でidだけではなく、 '肉類'という値も取得してからjs側にデータを渡さなければいけませんでした。

def create
food = Food.new(food_params)
if food.valid?
category = Category.find(food.category_id)
food.save
end
render json: { food: food, category: category }
end

コントローラーに以上の記述をし、カテゴリーの情報を取得してからjs側に送る事で解決しました。

const category = XHR.response.category;
const HTML =
<div class="category_id_js">
<a>${category.attributes.name}</a>
</div>;
food.js側には上記を追記。

投稿2020/12/23 01:12

kao.

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問