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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

1回答

1050閲覧

tagをcreateしたときに中間テーブルgroup_tagsにtag_idを自動登録したい。JSON形式・nativeJavaScriptを使用しています。

tomtomtomtom

総合スコア563

Ruby on Rails 6

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2020/08/04 17:42

編集2020/08/04 18:56

中間テーブルgroup_tagsにidを登録したい。

環境

ruby 2.5.1

rails 6.0.3.2

アソシエーション

ruby

1:groupモデル 2 3 has_many:group_tags 4 has_many:tags,through: :group_tags

ruby

1:group_tag中間モデル 2 3 belongs_to :group 4 belongs_to :tag

ruby

1:tagモデル 2 3 has_many:group_tags 4 has_many:groups,through: :group_tags

やりたいこと

tagをcreateしたときに中間テーブルgroup_tagsにidを自動登録したい

tagをcreateする際にstrong params を仲介して中間テーブルgroup_tagsにもtag_idを書き込みます。
下記はうまくいきました。

ruby

1:tags_controller.rb 2 3 def create 4 Tag.create(tag_params) 5 end 6 7 private 8 def tag_params 9 params.permit(:title,group_ids:[]) 10 end
:params {"authenticity_token"=>"Bm7Oa...", "title"=>"aaaaa", "commit"=>"作成", "group_ids"=>["1"], "controller"=>"tags", "action"=>"create"}
:tag_params {"title"=>"aaaaa", "group_ids"=>["1"]}

これをnativeJavaScriptで非同期させたいのですが、

ruby

1:tags_controller.rb 2 3 def create 4 @tag=Tag.create(tag_params) 5 respond_to do |format| 6 format.html {redirect_to :root} 7 format.json {render json: @tag} 8 end 9 end 10 11 private 12 def tag_params 13 params.permit(:title,group_ids:[]) 14 end

javascript

1form_tag_create.addEventListener('submit',function(e){ 2 3 e.preventDefault(); 4 5 let method=this.getAttribute("method"); 6 let url=this.getAttribute("action"); 7 let formData=new FormData(this); 8 let jsonData={}; 9 10 formData.forEach(function(value, key){ 11 if(key.endsWith("_ids[]")){ 12 jsonData[key]=[value]; 13 }else{ 14 jsonData[key]=value; 15 } 16 }); 17 18 let json=JSON.stringify(jsonData); 19 20 let xhr=new XMLHttpRequest(); 21 xhr.open(method,`${url}.json`); 22 xhr.setRequestHeader('Content-Type', 'application/json'); 23 xhr.send(json); 24 25});
:params {"authenticity_token"=>"Bm7Oa...", "title"=>"bbbbb", "group_ids[]"=>["1"], "controller"=>"tags", "action"=>"create", "format"=>"json", "tag"=>{"title"=>"bbbbb"}}
:tag_params {"title"=>"bbbbb"}

上記ではtagは登録されるのですが、中間テーブルgroup_tagsには登録されませんでした。
どのように修正すればよいのか、詳しい方がいらっしゃいましたら幸いです。
jqueryは訳有って使用できません。
javaScripは後ほど関数にして他でも使用予定です。
ご存じの方がいらっしゃいましたら、以上よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

javascript

1修正前 2 formData.forEach(function(value, key){ 3 if(key.endsWith("_ids[]")){ 4 jsonData[key]=[value]; 5 }else{ 6 jsonData[key]=value; 7 } 8 }); 9

javascript

1修正後 2 formData.forEach(function(value, key){ 3 if(key.endsWith("_ids[]")){ 4 jsonData[key.replace('[]','')]=[value]; //この行のみ変更 5 }else{ 6 jsonData[key]=value; 7 } 8 }); 9

以上でうまくいきました。
お騒がせしました。

投稿2020/08/06 03:14

tomtomtomtom

総合スコア563

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問