質問編集履歴

1

ソースコード

2020/07/07 13:24

投稿

Ponimaru
Ponimaru

スコア6

test CHANGED
File without changes
test CHANGED
@@ -18,4 +18,100 @@
18
18
 
19
19
  ### 該当のソースコード
20
20
 
21
+ ```haml
22
+
23
+ //new.html.haml
24
+
25
+
26
+
27
+ = form_for @product do |f|
28
+
29
+ 商品名#{f.text_field :name}
30
+
31
+ %br/
32
+
33
+ 価格#{f.number_field :price}
34
+
35
+ %br/
36
+
37
+ #image-box
38
+
39
+ = f.fields_for :images do |image|
40
+
41
+ .js-file_group{"data-index" => "#{image.index}"}
42
+
43
+ = image.file_field :src, class: 'js-file'
44
+
45
+ %br/
46
+
47
+ %span.js-remove 削除
48
+
49
+ = f.submit
50
+
51
+ ```
52
+
53
+
54
+
55
+ ```javascript
56
+
57
+ $(document).on('turbolinksload', ()=> {
58
+
59
+ // 画像用のinputを生成する関数
60
+
61
+ const buildFileField = (index)=> {
62
+
63
+ const html = `<div class="js-file_group" data-index="${index}">
64
+
65
+ <input class="js-file" type="file"
66
+
67
+ name="product[images_attributes][${index}][src]"
68
+
69
+ id="product_images_attributes_${index}_src">
70
+
71
+ <br>
72
+
73
+ <span class="js-remove">削除</div>
74
+
75
+ </div>`;
76
+
77
+ return html;
78
+
79
+ }
80
+
81
+
82
+
83
+ // file_fieldのnameに動的なindexをつける為の配列
84
+
85
+ let fileIndex = [1,2,3,4,5,6,7,8,9,10];
86
+
87
+
88
+
21
- [ソースコード](https://gyazo.com/ee2e9dfaa80fab073003986a9ad6e759)
89
+ $('#image-box').on('change', '.js-file', function(e) {
90
+
91
+ // fileIndexの先頭の数字を使ってinputを作る
92
+
93
+ $('#image-box').append(buildFileField(fileIndex[0]));
94
+
95
+ fileIndex.shift();
96
+
97
+ // 末尾の数に1足した数を追加する
98
+
99
+ fileIndex.push(fileIndex[fileIndex.length - 1] + 1)
100
+
101
+ });
102
+
103
+
104
+
105
+ $('#image-box').on('click', '.js-remove', function() {
106
+
107
+ $(this).parent().remove();
108
+
109
+ // 画像入力欄が0個にならないようにしておく
110
+
111
+ if ($('.js-file').length == 0) $('#image-box').append(buildFileField(fileIndex[0]));
112
+
113
+ });
114
+
115
+ });
116
+
117
+ ```