質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Ruby on Rails

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

JavaScript

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

Q&A

0回答

1064閲覧

JSによる多階層カテゴリー選択フォームでの編集を可能にする

pqtrick

総合スコア5

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Ruby on Rails

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

JavaScript

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

0グッド

0クリップ

投稿2020/03/22 12:46

###問題点
下記コードで出品時(new.html.haml)はうまくカテゴリーを取得できるのですが、
編集時(edit.html.haml)はうまくカテゴリーを取得できず、困っています。

###ゴール
編集画面に遷移した時点で、登録したカテゴリーがselectedされていて、かつ、出品時のようにカテゴリーをうまく取得及び選択できるようにしたい。

###該当コード

haml

1 .form__box__above 2 .form__group2 3 = f.label :category do 4 カテゴリー 5 %span.form-description.form-require 必須 6 = f.select :category, @category_parents_array, {include_blank: '選択してください'},{class: "exhibition__select",id: "parent_category",name: ""} 7 .form__group2 8 = f.label :category do 9 カテゴリー 10 %span.form-description.form-require 必須 11 = f.select :category, @category_children_array,{include_blank: '選択してください'},{class: "exhibition__select",id: "children_category",name: ""} 12 .form__group2 13 = f.label :category do 14 カテゴリー 15 %span.form-description.form-require 必須 16 = f.select :category, @category_grandchildren_array,{include_blank: '選択してください'},{class: "exhibition__select",id: "grandchildren_category",name: "product[category_id]"}

Ruby

1 def edit 2  ・ 3  ・ 4  ・ 5 省略 6 #カテゴリー編集用 7 # 登録されている商品の孫カテゴリーのレコードを取得し、孫カテゴリー選択肢用の配列作成 8 @selected_category = @product.category 9 @category_grandchildren_array = [] 10 Category.find("#{@selected_category.id}").siblings.each do |grandchild| 11 grandchildren_hash = {id: "#{grandchild.id}", name: "#{grandchild.name}"} 12 @category_grandchildren_array << grandchildren_hash 13 end 14 # binding.pry 15 # 選択されている子カテゴリーのレコードを取得し、子カテゴリー選択肢用の配列作成 16 @selected_child_category = @selected_category.parent 17 @category_children_array = [] 18 Category.find("#{@selected_child_category.id}").siblings.each do |child| 19 children_hash = {id: "#{child.id}", name: "#{child.name}"} 20 @category_children_array << children_hash 21 end 22 # 選択されている親カテゴリーのレコードを取得し、親カテゴリー選択肢用の配列作成 23 @selected_parent_category = @selected_category.parent 24 @category_parents_array = [] 25 Category.find("#{@selected_parent_category.id}").siblings.each do |parent| 26 parent_hash = {id: "#{parent.id}", name: "#{parent.name}"} 27 @category_parents_array << parent_hash 28 end 29end

JavaScript

1// カテゴリー選択部分 2$(function(){ 3 function appendOption(category){ 4 var html = `<option value="${category.id}">${category.name}</option>`; 5 return html; 6 } 7 // 子カテゴリーの表示作成 8 function appendChildrenBox(insertHTML){ 9 var childSelectHtml = ''; 10 childSelectHtml =`<div class="form__group2" id="children_box"> 11 <label for="product_category">カテゴリー 12 <span class="form-description form-require">必須</span> 13 </label> 14 <select class="exhibition__select" id="children_category" name=''> 15 <option value="">選択してください</option> 16 ${insertHTML} 17 </select> 18 </div>`; 19 $('.form__box__above').append(childSelectHtml); 20 } 21 // 孫カテゴリーの表示作成 22 function appendGrandchildrenBox(insertHTML){ 23 var grandchildSelectHtml = ''; 24 grandchildSelectHtml =`<div class="form__group2" id="grandchildren_box"> 25 <label for="product_category">カテゴリー 26 <span class="form-description form-require">必須</span> 27 </label> 28 <select class="exhibition__select" id="grandchildren_category" name='product[category_id]'> 29 <option value="">選択してください</option> 30 ${insertHTML} 31 </select> 32 </div>`; 33 $('.form__box__above').append(grandchildSelectHtml); 34 } 35 // 親カテゴリー選択時のイベント 36 $(document).on('change', '#parent_category', function(){ 37 var productCategory = document.getElementById('parent_category').value; //選択された親カテゴリーの取得 38 if (productCategory != ""){ //親カテゴリーが初期値以外 39 $.ajax({ 40 url: 'category_children', 41 type: 'GET', 42 data: { productCategory: productCategory}, 43 dataType: 'json' 44 }) 45 .done(function(children){ 46 $('#children_box').remove(); //親が変更時、子以下を削除 47 $('#grandchildren_box').remove(); 48 var insertHTML = ''; 49 children.forEach(function(child){ 50 insertHTML += appendOption(child); 51 }); 52 appendChildrenBox(insertHTML); 53 }) 54 .fail(function(){ 55 alert('カテゴリー選択に失敗しました'); 56 }) 57 }else{ //親カテゴリーが初期値 58 $('#children_box').remove(); 59 $('#grandchildren_box').remove(); 60 } 61 }); 62 // 子カテゴリー選択時のイベント 63 $(document).on('change', '#children_category', function(){ 64 var productCategory = document.getElementById('children_category').value; //選択された子カテゴリーの取得 65 if (productCategory != ""){ //子カテゴリーが初期値以外 66 $.ajax({ 67 url: 'category_grandchildren', 68 type: 'GET', 69 data: { productCategory: productCategory}, 70 dataType: 'json' 71 }) 72 .done(function(grandchildren){ //子が変更時、孫を削除 73 var insertHTML = ''; 74 grandchildren.forEach(function(grandchild){ 75 insertHTML += appendOption(grandchild); 76 }); 77 appendGrandchildrenBox(insertHTML); 78 $(document).on('change', '#children_category', function(){ 79 $('#grandchildren_box').remove(); 80 }) 81 }) 82 .fail(function(){ 83 alert('カテゴリー選択に失敗しました'); 84 }) 85 }else{ //子カテゴリーが初期値 86 $('#grandchildren_box').remove(); 87 } 88 }); 89});

知識不足ではありますが、ご教授していただけると幸いです。よろしくお願いいたします

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問