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

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

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

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

JavaScript

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

jQuery

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

Q&A

解決済

1回答

2009閲覧

Jqueryで追加されたフォームの値をDBに保存する方法について

ringo_000

総合スコア7

Ruby on Rails 5

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

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/01/31 06:16

編集2020/02/01 12:18

前提・実現したいこと

Rails 5.2.4.1 使用しています。

railsで親子孫ひ孫モデルを一度にデータを登録する機能の実装をしています。
参考サイト https://www.subculeng.com/?p=740

モデル(テーブル)の関係は以下です。
親 post
子 program
孫 hard
ひ孫 product

post, has_many :programs
program, belongs_to :post
has_many :hards
hard, belongs_to :program
has_many :products
product, belongs_to :hard

コントローラーの記述に、buildメソッドを使い、子孫ひ孫のインスタンスを作成しました。
ビューではfields_forを使って、表示させています。

ここからが本題です。
hardテーブルのcategoryカラムとproductテーブルのthingカラムは複数の値を保存させたいです。
jqueryを使って、hardのtext_fieldの横にボタンを設置し、追加するボタンを押したら、
とりあえずは1つの項目が追加できるようになっている状態です。
ですが追加した項目に入力した値は保存されますが、オリジナルの項目フォームには保存されません。
例えば、オリジナルに「iPad」と入力し、追加した項目に「iPhone」と入力したら、「iPhone」だけが保存されます。

今回該当する箇所のコードを抜粋します。

HAML

1.best-main 2 .best-main-text 3 ハード 4 = d.fields_for :hards, class:"hards-parent" do |m| 5 = m.text_field :category, placeholder: "category", type: "text", class:"hards-input-text", id: "hard_text" 6 = icon('far', 'plus-square', id: 'pulas-hard') 7 #add

以下は全体のコードです。

該当のソースコード

HAML

1= render 'partial/sidebar' 2.main 3 %span.main-child 4 施設情報・納品情報を登録してください 5 .main-registration__date 6 .main-registration__date-child 7 登録日 8 = form_for @post, url: posts_path do |f| 9 =f.text_field :registration_date, placeholder: "登録日", type: "text", class:"registration__date-input-text" 10 11 .main-facility 12 .main-facility-child 13 施設名 14 =f.text_field :facility_name, placeholder: "施設名", type: "text", class:"facility-input-text" 15 16 .main-postal__code 17 .main-postal__code-child 18 郵便番号 19 =f.text_field :postal_code, placeholder: "郵便番号", type: "text", class:"postal__code-input-text" 20 21 .main-address 22 .main-address-child 23 住所 24 =f.text_field :address, placeholder: "住所", type: "text", class:"address-input-text" 25 26 .main-tell 27 .main-tell-child 28 電話番号 29 =f.text_field :tell, placeholder: "電話番号", type: "text", class:"tell-input-text" 30 31 .main-delivery_date 32 .main-delivery_date-child 33 納品日 34 =f.text_field :delivery_date, placeholder: "納品日", type: "text", class:"delivery_date-input-text" 35 36 .main-delivery_note 37 .main-delivery_note-child 38 納品書 39 = f.file_field :delivery_note, class: "delivery_note-image" 40 41 .main-estimate_sheet 42 .main-estimate_sheet-child 43 見積書 44 = f.file_field :estimate_sheet, class: "estimate_sheet-image" 45 46 .footer 47 48 .best 49 %span.best-name 50 納品/ソフトウェアを登録してください 51 .best-software 52 .best-software-child 53 ソフト 54 = f.fields_for :programs do |d| 55 = d.text_field :software, placeholder: "name", type: "text", class:"software-input-text" 56 57 .best-main 58 .best-main-text 59 ハード 60 = d.fields_for :hards, class:"hards-parent" do |m| 61 = m.text_field :category, placeholder: "category", type: "text", class:"hards-input-text", id: "hard_text" 62 = icon('far', 'plus-square', id: 'pulas-hard') 63 #add 64 65 .products 66 .products-text 67 プロダクト 68 = m.fields_for :products do |s| 69 = s.text_field :thing, placeholder: "products", type: "text", class:"products-input-text" 70 = icon('far', 'plus-square', id: 'pulas-product') 71 72 .footer 73 = f.submit "send", class:"products_button"

javascript

1 2$(function(){ 3 4 function buildHTML(){ 5 let html = `<input placeholder="category" type="text" class="hards-input-text" id="hard_text" name="post[programs_attributes][0][hards_attributes][0][category]">` 6 7 return html; 8 } 9 10 $("#pulas-hard").click(function(e){ 11 e.preventDefault(); 12 13 let html = buildHTML(); 14 let type_text = document.getElementById("hard_text").getAttribute("type"); 15 16 $("#add").addClass("add_text"); 17 $(".add_text").append(html); 18 $(".add_text").attr(type_text); 19 20 }); 21});

postscontroller

1def new 2 @post = Post.new 3 programs = @post.programs.build 4 hards = programs.hards.build 5 products = hards.products.build 6 end 7 8 def create 9 @post = Post.new(post_params) 10 @post.save 11 end 12 13private 14 15 def post_params 16 params.require(:post).permit(:facility_name, :address, :tell, :registration_date, :estimate_sheet, :delivery_date, :delivery_note, :postal_code, :user_id, programs_attributes:[:software, :user, :post_id, hards_attributes:[:category, :program_id, :_destroy, products_attributes:[:thing, :user_id, :hard_id]]]).merge(user_id: current_user.id) 17 end

試したこと

getElementByIdで要素を取得してしまったからオリジナルのフォームの値は保存されないのかと思い、
オリジナルのクローンを作る、書き方に変更して試してみました。
ですが、今度はオリジナルは保存できて、追加した項目の値が保存されないようになりました。

javascript

1$(document).on("click", "#pulas-hard", function() { 2 3 $("#hard_text").clone(true).insertAfter("#hard_text"); 4});

最終的にどうしたいか、具体的に

hardテーブルの直近の親はprogramテーブルで、hardテーブルには外部キーでprogram_idが入るようにしています。
hardテーブルのcategoryカラムは一度に複数登録してもそれらには、同じprogram_idが入るようにして紐づけしたいです。

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

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

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

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

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

guest

回答1

0

自己解決

= m.text_field :category, placeholder: "category", type: "text", class:"hards-input-text", id: "hard_text"
この一文に含まれる、name[0]のカウントを増やすことによって値を保存する事が可能になりました。

投稿2020/02/03 11:07

ringo_000

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問