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

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

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

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

Ruby on Rails

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

0回答

1504閲覧

jQueryで取得した値をformで保存したい

show_kanazawa

総合スコア12

Ruby

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

Ruby on Rails

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2019/11/07 11:38

初学者です。
勉強のためフリマアプリのコピーサイトを作っています。
商品出品時に商品のカテゴリーのドロップダウンを実装しているところです。
メンズ >> トップス >>Tシャツ のように親要素が選択されたら子要素を表示し、、、という機能をjQueryを使用し作ったのですが、親子孫要素のカテゴリー名を配列型にしDBに保存がしたいです。(idではなく)
カテゴリー一覧はancestryを使いcategories テーブルに格納し controllerで親要素を取得、そこからjQueryで親要素が選択されたら子要素の選択ボックスが表示され、、という流れです。
選択ボックスの表示はf.selectを使用していますが,親要素しか渡せていなく、実装方法をご教授いただきたいです。
submitを押した際に配列で保存されるようにしたいです。

宜しくお願いします。

--new.html.haml

%h4 カテゴリー
.listing-product-detail__category
= f.select :categories, @category_parent_array, {}, {id: 'parent_category'}

--products_controller

def new
@product = Product.new
@product.images.build
@product.build_freight
@product.build_root_area
@product.build_day
@category_parent_array = ["---"]
Category.where(ancestry: nil).limit(13).each do |parent|
@category_parent_array << parent.name
end
end

def get_category_children
@category_children = Category.find_by(name: "#{params[:parent_name]}", ancestry: nil).children
end

def get_category_grandchildren
@category_grandchildren = Category.find("#{params[:child_id]}").children
end

def create
@product = Product.new(product_params)
if @product.save
redirect_to root_path
else
render :new, notice: '保存できませんでした'
end
end

--category.js

$(document).on('turbolinks:load', function() {
$(function(){
function appendOption(category){
var html = <option value="${category.name}" data-category="${category.id}">${category.name}</option>;
return html;
}

function appendChildrenBox(insertHTML){ var childSelecthtml = ''; childSelectHtml = `<div class='listing-select-wrapper__added' id= 'children_wrapper'> <select class="listing-select-wrapper__box--select" id="child_category" name="category_id"> <option value="---" data-category="---">---</option> ${insertHTML} <select> </div>`; $('.listing-product-detail__category').append(childSelectHtml); } function appendGrandchildrenBox(insertHTML){ var grandchildSelectHtml = `<div class='listing-select-wrapper__added' id= 'grandchildren_wrapper'> <select class="listing-select-wrapper__box--select" id="grandchild_category" name="category_id"> <option value="---" data-category="---">---</option> ${insertHTML} <select> </div>`; $('.listing-product-detail__category').append(grandchildSelectHtml); } $('#parent_category').on('change',function(){ var parentCategory = document.getElementById('parent_category').value; if (parentCategory != "---"){ $.ajax({ url: 'get_category_children', type: 'GET', data: { parent_name: parentCategory }, dataType: 'json' }) .done(function(children){ $('#children_wrapper').remove(); $('#grandchildren_wrapper').remove(); var insertHTML = ''; children.forEach(function(child){ insertHTML += appendOption(child); }); appendChildrenBox(insertHTML); }) .fail(function(){ alert('カテゴリー 取得に失敗しました') }) }else{ $('#children_wrapper').remove(); $('#grandchildren_wrapper').remove(); } }); $('.listing-product-detail__category').on('change', '#child_category',function(){ var childId = $('#child_category option:selected').data('category'); if (childId != "---"){ $.ajax({ url: 'get_category_grandchildren', type: 'GET', data: { child_id: childId }, dataType: 'json' }) .done(function(grandchildren){ if (grandchildren.length !=0) { $('#grandchildren_wrapper').remove(); var insertHTML = ''; grandchildren.forEach(function(grandchild){ insertHTML += appendOption(grandchild); }); appendGrandchildrenBox(insertHTML); } }) .fail(function(){ alert('カテゴリー 取得に失敗しました') }) }else{ $('#grandchildren_wrapper').remove(); } });

});
});

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

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

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

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

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

yambejp

2019/11/08 01:21

フロントとバックの切り分けがわかるように質問ください jQueryはデータを構造化して送り出すところまでです。 フロント側がわからないなら、具体的なhtmlソースと 期待するデータ構造を例示ください。 バック側はget/postもしくはファイルを受け取り ファイルもしくはRDBに保存することになるでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問