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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

2回答

4298閲覧

rails cocoonの追加されたフォームの配列番号がおかしい件について

Masashige1005

総合スコア14

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/06/08 09:24

編集2020/06/08 09:58

環境:ruby on rails6

gem: cocoon

現在、cocoonにて複数テーブルの保存をしようとしているのですが、cocoonで追加されたフォームが変な配列番号が入ってしまうのでどうやったら修正できるのか。

parameter

1<ActionController::Parameters {"0"=><ActionController::Parameters {"big_category_id"=>"7", "small_category_id"=>["19", "20", "37"]} permitted: false>, "1591607240334"=>{"big_category_id"=>"11", "small_category_id"=>["19", "20", "26"]}} permitted: false> 2``````1591607240334```の部分を1とかにするやり方はありませんか?追加されるフォームでそれぞれランダムな数字になってしまうので追加されたフォームは1,2,3...と続けて作られるようにしたいです。 3 4```View 5<%= f.fields_for :categories_items do |q| %> 6 <%= render 'categories_items_fields', f: q %> 7<% end %> 8<div class = "links"> 9 <%= link_to_add_association 'add new', f, :categories_items, :partial => 'categories_items_fields', :force_non_association_create => true %> 10</div>

View

1<li class="string input optional stringish" id="item_category_input"> 2 <%= f.label :カテゴリー %> 3 <div> 4 <%= f.collection_select(:big_category_id, Category.where(genre_div: 0), :id, :name, include_blank: true) %> 5 </div> 6</li> 7<li class="string input optional stringish" id="item_category_input"> 8 <div class="small_category_field"> 9 <%= f.collection_check_boxes(:small_category_id, Category.where(genre_div: 1), :id, :name, include_hidden: false) do |b| %> 10 <%= b.label { b.check_box + b.text} %> 11 <% end %> 12 </div> 13</li>

controller

1def new 2 @item = Item.new 3 @item.categories_items.build 4 @smalls = Category.where(genre_div: 1) 5end 6 7def item_params 8 params.require(:item).permit( 9 :name, :price, :stock, :handling_time, :maker, :model, :description, :memo, :sold_out_div, { small_category_ids: [] }).merge( 10 images: uploaded_images, updated_by: current_admin_user.membername, created_by: current_admin_user.membername) 11end

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

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

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

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

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

Mugheart

2020/06/08 09:26

僕たちはエスパーではないので、ソースコードを載せていただかないと何もわかりません。
Masashige1005

2020/06/08 09:28

Viewページを追記しました。
Mugheart

2020/06/08 09:37

パラメータをどのように構成するかはinput要素のname属性によるので、 その部分が書かれているであろう _categories_items_fields ファイルがないと何もわかりません。 それ以外にも質問に関連するファイルは全て提示してください。
maisumakun

2020/06/09 00:42

> 1591607240334の部分を1とかにするやり方はありませんか? なぜそうしたいのでしょうか。この値は入力グループの識別にだけ使われるもので、保存後まで残ることはありません。
guest

回答2

0

ベストアンサー

link_to_add_associationからフォームが追加される流れを軽く追ってみましたが、おそらくcreate_new_idが質問中の"1591607240334"に当たる部分を生成していると思われます。

js

1var create_new_id = function() { 2 return (new Date().getTime() + cocoon_element_counter++); 3}

見ての通り現時刻を利用しているため、ここを上書きしないことには 1 や 2 のような数値にするのは難しそうです。
cocoon にここの値を上書きするようなオプションは用意されていませんか?

なければクリックイベントを上書きするしかないかなーと思うんですが...。

js

1 $(document).on('click', '.add_fields', function(e) { 2 e.preventDefault(); 3 e.stopPropagation(); 4 5 var $this = $(this), 6 assoc = $this.data('association'), 7 assocs = $this.data('associations'), 8 content = $this.data('association-insertion-template'), 9 insertionMethod = $this.data('association-insertion-method') || $this.data('association-insertion-position') || 'before', 10 insertionNode = $this.data('association-insertion-node'), 11 insertionTraversal = $this.data('association-insertion-traversal'), 12 count = parseInt($this.data('count'), 10), 13 regexp_braced = new RegExp('\[new_' + assoc + '\](.*?\s)', 'g'), 14 regexp_underscord = new RegExp('_new_' + assoc + '_(\w*)', 'g'), 15 new_id = create_new_id(), 16 new_content = content.replace(regexp_braced, newcontent_braced(new_id)), 17 new_contents = [], 18 originalEvent = e; 19 20 21 if (new_content == content) { 22 regexp_braced = new RegExp('\[new_' + assocs + '\](.*?\s)', 'g'); 23 regexp_underscord = new RegExp('_new_' + assocs + '_(\w*)', 'g'); 24 new_content = content.replace(regexp_braced, newcontent_braced(new_id)); 25 } 26 27 new_content = new_content.replace(regexp_underscord, newcontent_underscord(new_id)); 28 new_contents = [new_content]; 29 30 count = (isNaN(count) ? 1 : Math.max(count, 1)); 31 count -= 1; 32 33 while (count) { 34 new_id = create_new_id(); 35 new_content = content.replace(regexp_braced, newcontent_braced(new_id)); 36 new_content = new_content.replace(regexp_underscord, newcontent_underscord(new_id)); 37 new_contents.push(new_content); 38 39 count -= 1; 40 } 41 42 var insertionNodeElem = getInsertionNodeElem(insertionNode, insertionTraversal, $this) 43 44 if( !insertionNodeElem || (insertionNodeElem.length == 0) ){ 45 console.warn("Couldn't find the element to insert the template. Make sure your `data-association-insertion-*` on `link_to_add_association` is correct.") 46 } 47 48 $.each(new_contents, function(i, node) { 49 var contentNode = $(node); 50 51 var before_insert = jQuery.Event('cocoon:before-insert'); 52 insertionNodeElem.trigger(before_insert, [contentNode, originalEvent]); 53 54 if (!before_insert.isDefaultPrevented()) { 55 // allow any of the jquery dom manipulation methods (after, before, append, prepend, etc) 56 // to be called on the node. allows the insertion node to be the parent of the inserted 57 // code and doesn't force it to be a sibling like after/before does. default: 'before' 58 var addedContent = insertionNodeElem[insertionMethod](contentNode); 59 60 insertionNodeElem.trigger('cocoon:after-insert', [contentNode, 61 originalEvent]); 62 } 63 }); 64 });

それをするくらいなら cocoon を使う意味はないのかなと思います。
自分で実装した方がおそらく楽です。
"1591607240334"がパラメータのキーに来ることによってどう困るのかにもよりますが、ある程度割り切ってしまって使用するのがいいのかなと思います。

投稿2020/06/09 00:40

編集2020/06/09 00:43
Mugheart

総合スコア2349

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

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

0

おそらく、
既存のデータと新規(未save)で分けているのだと思います。
そのまま 取り込んでsaveすると1,2,3,4となるのではないでしょうか。

投稿2020/06/08 10:40

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問