teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

画像プレビュー機能を実装したJavaScriptのコードを追記しております。

2021/08/21 04:30

投稿

kawanoonigiri
kawanoonigiri

スコア14

title CHANGED
File without changes
body CHANGED
@@ -206,9 +206,47 @@
206
206
  <% end %>
207
207
  ```
208
208
 
209
+ 下記、プレビュー機能を実装したJavaScriptのコードです。
209
- (さらに追記分)
210
+ ```javascript
211
+ document.addEventListener('DOMContentLoaded', function() {
212
+ if (document.getElementById('store_image')){
213
+ const ImageList = document.getElementById('image-list')
214
+
215
+ const createImageHTML = (blob) => {
216
+ const imageElement = document.createElement('div')
217
+ imageElement.setAttribute('class', "image-element")
218
+ let imageElementNum = document.querySelectorAll('.image-element').length
219
+
220
+ const blobImage = document.createElement('img')
221
+ blobImage.setAttribute('src', blob)
210
222
 
223
+ const inputHTML = document.createElement('input')
224
+ inputHTML.setAttribute('id', `store_image_${imageElementNum}`)
225
+ inputHTML.setAttribute('name', 'store[images][]')
226
+ inputHTML.setAttribute('type', 'file')
211
227
 
228
+ imageElement.appendChild(blobImage)
229
+ imageElement.appendChild(inputHTML)
230
+ ImageList.appendChild(imageElement)
231
+
232
+ inputHTML.addEventListener('change', (e) => {
233
+ file = e.target.files[0];
234
+ blob = window.URL.createObjectURL(file);
235
+
236
+ createImageHTML(blob)
237
+ })
238
+ }
239
+
240
+ document.getElementById('store_image').addEventListener('change', (e) => {
241
+ let file = e.target.files[0];
242
+ let blob = window.URL.createObjectURL(file);
243
+
244
+ createImageHTML(blob)
245
+ });
246
+ };
247
+ });
248
+ ```
249
+
212
250
  ### 試したこと
213
251
 
214
252
  モデル内のバリデーションにて:imagesのみ削除し、画像なしで投稿できるか試してみたところその他の情報は正しく保存され、またローカル環境でも正しく表示されていました。

4

Storeモデル、コントローラーの全記述とcreateアクションの際取得できるparamsの値を再掲載しました。

2021/08/21 04:30

投稿

kawanoonigiri
kawanoonigiri

スコア14

title CHANGED
File without changes
body CHANGED
@@ -50,42 +50,153 @@
50
50
  end
51
51
  ```
52
52
    
53
- 下記はstores_controller.rb内の記述です。(投稿と画像の反映に関係しそうなactionのみ記述しています。)
53
+ 下記はstores_controller.rb内の記述です。
54
54
  ```ruby
55
+ class StoresController < ApplicationController
55
- def index
56
+ def index
56
57
  @store = Store.includes(:user)
57
- end
58
+ end
58
59
 
60
+ def new
61
+ @store = Store.new
62
+ end
63
+
59
- def create
64
+ def create
60
65
  @store = Store.new(post_params)
66
+ binding.pry
61
67
  if @store.valid?
62
68
  @store.save
63
69
  redirect_to root_path
64
70
  else
65
71
  render :new
66
72
  end
67
- end
73
+ end
68
74
 
69
- def show
75
+ def show
70
76
  @comment = Comment.new
71
77
  @store = Store.find(params[:id])
72
78
  @comments = @store.comments.includes(:user)
73
- end
79
+ end
74
80
 
81
+ def edit
82
+ @store = Store.find(params[:id])
83
+ end
84
+
85
+ def update
86
+ @store = Store.find(params[:id])
87
+ if @store.update(post_params)
88
+ redirect_to store_path(@store)
89
+ else
90
+ render :edit
91
+ end
92
+ end
93
+
94
+ def destroy
95
+ @store = Store.find(params[:id])
96
+ @store.destroy
97
+ redirect_to root_path
98
+ end
99
+
75
- private
100
+ private
76
101
  def post_params
102
+ params.require(:store).permit(:name, :address, :postal_code, :telephone, :url, :closing_day, :business_hour, :fee, :water, :temperature,
77
- params.require(:store).permit(:name, {中略}  ,:bgm, images: [] ).merge(user_id: current_user.id)
103
+ :roryu_status, :roryu_time, :air_bath, :break_place, :television, :bgm, :water_depth, images: [] ).merge(user_id: current_user.id)
78
104
  end
105
+ end
79
106
  ```
80
107
    
81
108
  以下投稿フォームの記述です。
82
109
  ```ruby
83
110
  <%= form_with model: store, local: true do |f|%>
111
+ <div class="field">
112
+ <%= f.label :name, "店舗名" %><br />
113
+ <%= f.text_field :name, class: :form__text, id:"store_title" %>
114
+ </div>
84
115
 
116
+ <div class="field">
117
+ <%= f.label :postal_code, "郵便番号" %><br />
118
+ <%= f.text_field :postal_code, class: :form__text, id:"store_catch_copy" %>
85
- (中略)
119
+ </div>
120
+
121
+ <div class="field">
122
+ <%= f.label :address, "住所" %><br />
123
+ <%= f.text_field :address, class: :form__text, id:"store_concept" %>
124
+ </div>
125
+
126
+ <div class="field">
127
+ <%= f.label :telephone, "電話番号" %><br />
128
+ <%= f.text_field :telephone, class: :form__text, id:"store_image" %>
129
+ </div>
130
+
131
+ <div class="field">
132
+ <%= f.label :url, "公式HP" %><br />
133
+ <%= f.text_field :url, class: :form__text, id:"store_concept" %>
134
+ </div>
135
+
136
+ <div class="field">
137
+ <%= f.label :closing_day, "店休日" %><br />
138
+ <%= f.text_field :closing_day, class: :form__text, id:"store_concept" %>
139
+ </div>
140
+
141
+ <div class="field">
142
+ <%= f.label :business_hour, "営業時間" %><br />
143
+ <%= f.text_field :business_hour, class: :form__text, id:"store_concept" %>
144
+ </div>
145
+
146
+ <div class="field">
147
+ <%= f.label :fee, "入浴料" %><br />
148
+ <%= f.text_field :fee, class: :form__text, id:"store_concept" %>
149
+ </div>
150
+
151
+ <div class="field">
152
+ <%= f.label :roryu_status, "ロウリュ" %><br />
153
+ <%= f.text_field :roryu_status, class: :form__text, id:"store_concept" %>
154
+ </div>
155
+
156
+ <div class="field">
157
+ <%= f.label :roryu_time, "ロウリュの時間" %><br />
158
+ <%= f.text_field :roryu_time, class: :form__text, id:"store_concept" %>
159
+ </div>
160
+
161
+ <div class="field">
162
+ <%= f.label :temperature, "サウナ室内の温度" %><br />
163
+ <%= f.text_field :temperature, class: :form__text, id:"store_concept" %>
164
+ </div>
165
+
166
+ <div class="field">
167
+ <%= f.label :television, "サウナ室内のテレビ設置" %><br />
168
+ <%= f.text_field :television, class: :form__text, id:"store_concept" %>
169
+ </div>
170
+
171
+ <div class="field">
172
+ <%= f.label :water, "水風呂" %><br />
173
+ <%= f.text_field :water, class: :form__text, id:"store_concept" %>
174
+ </div>
175
+
176
+ <div class="field">
177
+ <%= f.label :water_depth, "水深" %><br />
178
+ <%= f.text_field :water_depth, class: :form__text, id:"store_concept" %>
179
+ </div>
180
+
181
+
182
+ <div class="field">
183
+ <%= f.label :air_bath, "外気浴" %><br />
184
+ <%= f.text_field :air_bath, class: :form__text, id:"store_concept" %>
185
+ </div>
186
+
187
+ <div class="field">
188
+ <%= f.label :break_place, "インターバル" %><br />
189
+ <%= f.text_field :break_place, class: :form__text, id:"store_concept" %>
190
+ </div>
191
+
192
+ <div class="field">
193
+ <%= f.label :bgm, "サウナ内BGM" %><br />
194
+ <%= f.text_field :bgm, class: :form__text, id:"store_concept" %>
195
+ </div>
196
+
86
197
  <div class="field" >
87
198
  <%= f.label :images, "店舗画像" %><br />
88
- <%= f.file_field :images, name: 'message[images][]', id:"store_image" %>
199
+ <%= f.file_field :images, id: "message_image", multiple: true %>
89
200
  <div id="image-list"></div>
90
201
  </div>
91
202
 
@@ -102,12 +213,12 @@
102
213
 
103
214
  モデル内のバリデーションにて:imagesのみ削除し、画像なしで投稿できるか試してみたところその他の情報は正しく保存され、またローカル環境でも正しく表示されていました。
104
215
    
105
- さらに追記)
216
+ (追記)
106
217
  Stores_controller.rb内のcreateアクションにて取得したparamsの中身を確認したところ、下記のように添付した画像2つは取得できているように思います。
107
- ただ、保存されているDBを見るとID:5のレコードの中に1枚画像が保存されているだけのように見えました
218
+ しかしデータベースに保存されている画像は1枚のみです
108
219
 
109
220
  ```
110
- "message"=>{"images"=>[
111
- #<ActionDispatch::Http::UploadedFile:0x00007fec0999ef38 @tempfile=#<Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210819-9041-14byoem.jpeg>, @original_filename="8C7BBE13-CD6C-4D01-B878-B46EF9A2C53F.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"8C7BBE13-CD6C-4D01-B878-B46EF9A2C53F.jpeg\"\r\nContent-Type: image/jpeg\r\n">,
112
- #<ActionDispatch::Http::UploadedFile:0x00007fec0999eec0 @tempfile=#<Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210819-9041-1xyvg8a.jpeg>, @original_filename="8BACB604-C5B2-4FC5-9878-39F82E0B1C29.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"8BACB604-C5B2-4FC5-9878-39F82E0B1C29.jpeg\"\r\nContent-Type: image/jpeg\r\n">]}, "commit"=>"登録する", "controller"=>"stores", "action"=>"create"} permitted: false>
221
+ <ActionController::Parameters {"authenticity_token"=>"CuKTE0J3Va0ohKVkCyvbutsgYI08W5k42v9ybDmbb2d5xGiU6yueUvWuVFH8NF02uPkilKl16TooYEPLanjNqA==", "store"=><ActionController::Parameters {"name"=>"熱い湯", "postal_code"=>"123-4567", "address"=>"県", "telephone"=>"無", "url"=>"無", "closing_day"=>"無", "business_hour"=>"無", "fee"=>"200", "roryu_status"=>"無", "roryu_time"=>"無", "temperature"=>"100", "television"=>"無", "water"=>"10", "water_depth"=>"100", "air_bath"=>"無", "break_place"=>"無", "bgm"=>"無", "images"=>[#<ActionDispatch::Http::UploadedFile:0x00007fa67a60c048 @tempfile=#
222
+ <Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210820-1656-4p688y.png>, @original_filename="200x200.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"store[images][]\"; filename=\"200x200.png\"\r\nContent-Type: image/png\r\n">]} permitted: false>, "message"=>{"images"=>[#<ActionDispatch::Http::UploadedFile:0x00007fa67a617bf0 @tempfile=#
223
+ <Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210820-1656-7kbbi8.png>, @original_filename="200x200.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"200x200.png\"\r\nContent-Type: image/png\r\n">]}, "commit"=>"登録する", "controller"=>"stores", "action"=>"create"} permitted: false>
113
224
  ```

3

createアクションにて取得したparamsに変更しました。先程の追記分はupdateアクションで取得したparamsでした。

2021/08/20 09:07

投稿

kawanoonigiri
kawanoonigiri

スコア14

title CHANGED
File without changes
body CHANGED
@@ -107,6 +107,7 @@
107
107
  ただ、保存されているDBを見るとID:5のレコードの中に1枚分の画像が保存されているだけのように見えました。
108
108
 
109
109
  ```
110
- #<ActionDispatch::Http::UploadedFile:0x00007fec09aca6f0 @tempfile=#<Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210819-9041-10m9lkn.jpeg>, @original_filename="8C7BBE13-CD6C-4D01-B878-B46EF9A2C53F.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"8C7BBE13-CD6C-4D01-B878-B46EF9A2C53F.jpeg\"\r\nContent-Type: image/jpeg\r\n">,
111
- #<ActionDispatch::Http::UploadedFile:0x00007fec09aca600 @tempfile=#<Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210819-9041-1c5uhv1.jpeg>, @original_filename="8B3B5414-6D5F-475A-BA53-AD488CB90E2A.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"8B3B5414-6D5F-475A-BA53-AD488CB90E2A.jpeg\"\r\nContent-Type: image/jpeg\r\n">]}, "commit"=>"登録する", "controller"=>"stores", "action"=>"update", "id"=>"5"} permitted: false>
110
+ "message"=>{"images"=>[
111
+ #<ActionDispatch::Http::UploadedFile:0x00007fec0999ef38 @tempfile=#<Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210819-9041-14byoem.jpeg>, @original_filename="8C7BBE13-CD6C-4D01-B878-B46EF9A2C53F.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"8C7BBE13-CD6C-4D01-B878-B46EF9A2C53F.jpeg\"\r\nContent-Type: image/jpeg\r\n">,
112
+ #<ActionDispatch::Http::UploadedFile:0x00007fec0999eec0 @tempfile=#<Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210819-9041-1xyvg8a.jpeg>, @original_filename="8BACB604-C5B2-4FC5-9878-39F82E0B1C29.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"8BACB604-C5B2-4FC5-9878-39F82E0B1C29.jpeg\"\r\nContent-Type: image/jpeg\r\n">]}, "commit"=>"登録する", "controller"=>"stores", "action"=>"create"} permitted: false>
112
113
  ```

2

createアクション内で取得されたparamsの中身について追記しています。

2021/08/19 02:15

投稿

kawanoonigiri
kawanoonigiri

スコア14

title CHANGED
File without changes
body CHANGED
@@ -13,7 +13,7 @@
13
13
  情報不足であれば追加いたします。
14
14
  よろしくお願いいたします。
15
15
 
16
- (追記)
16
+
17
17
  ### 現在発生しているエラー
18
18
  エラー表示は出ていません。
19
19
  投稿フォームの画像選択のほか全ての項目を埋め、送信ボタンを押すとバリデーションを通過できずにnewページがレンダリングされます。
@@ -78,7 +78,6 @@
78
78
  end
79
79
  ```
80
80
    
81
- (追記)
82
81
  以下投稿フォームの記述です。
83
82
  ```ruby
84
83
  <%= form_with model: store, local: true do |f|%>
@@ -96,6 +95,18 @@
96
95
  <% end %>
97
96
  ```
98
97
 
98
+ (さらに追記分)
99
+
100
+
99
101
  ### 試したこと
100
102
 
101
- モデル内のバリデーションにて:imagesのみ削除し、画像なしで投稿できるか試してみたところその他の情報は正しく保存され、またローカル環境でも正しく表示されていました。
103
+ モデル内のバリデーションにて:imagesのみ削除し、画像なしで投稿できるか試してみたところその他の情報は正しく保存され、またローカル環境でも正しく表示されていました。
104
+   
105
+ (さらに追記)
106
+ Stores_controller.rb内のcreateアクションにて取得したparamsの中身を確認したところ、下記のように添付した画像2つは取得できているように思います。
107
+ ただ、保存されているDBを見るとID:5のレコードの中に1枚分の画像が保存されているだけのように見えました。
108
+
109
+ ```
110
+ #<ActionDispatch::Http::UploadedFile:0x00007fec09aca6f0 @tempfile=#<Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210819-9041-10m9lkn.jpeg>, @original_filename="8C7BBE13-CD6C-4D01-B878-B46EF9A2C53F.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"8C7BBE13-CD6C-4D01-B878-B46EF9A2C53F.jpeg\"\r\nContent-Type: image/jpeg\r\n">,
111
+ #<ActionDispatch::Http::UploadedFile:0x00007fec09aca600 @tempfile=#<Tempfile:/var/folders/8c/bzvqv8g14h9fsrkg93q1kjx40000gn/T/RackMultipart20210819-9041-1c5uhv1.jpeg>, @original_filename="8B3B5414-6D5F-475A-BA53-AD488CB90E2A.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"8B3B5414-6D5F-475A-BA53-AD488CB90E2A.jpeg\"\r\nContent-Type: image/jpeg\r\n">]}, "commit"=>"登録する", "controller"=>"stores", "action"=>"update", "id"=>"5"} permitted: false>
112
+ ```

1

現在発生しているエラー、投稿フォームのviewについて追記しました。

2021/08/19 02:05

投稿

kawanoonigiri
kawanoonigiri

スコア14

title CHANGED
File without changes
body CHANGED
@@ -13,8 +13,13 @@
13
13
  情報不足であれば追加いたします。
14
14
  よろしくお願いいたします。
15
15
 
16
+ (追記)
17
+ ### 現在発生しているエラー
18
+ エラー表示は出ていません。
19
+ 投稿フォームの画像選択のほか全ての項目を埋め、送信ボタンを押すとバリデーションを通過できずにnewページがレンダリングされます。
20
+
16
21
  ### 該当のソースコード
17
-
22
+   
18
23
  下記はトップページのviewです。
19
24
  ```ruby
20
25
  <div class="messages">
@@ -23,7 +28,7 @@
23
28
  <% end %>
24
29
  </div>
25
30
  ```
26
-
31
+   
27
32
  こちらは詳細ページのviewです。
28
33
  ```ruby
29
34
  <% @store.images.each do |image| %>
@@ -32,8 +37,8 @@
32
37
  </div>
33
38
  <% end %>
34
39
  ```
35
-
40
+   
36
- こちらはモデル内の記述です。
41
+ こちらはstore.rb内の記述です。(バリデーションの記述が長いので一部省略しています。)
37
42
  ```ruby
38
43
  has_many :comments, dependent: :destroy
39
44
  has_many :goods, dependent: :destroy
@@ -44,9 +49,9 @@
44
49
  validates :name, (中略) ,:bgm, :images
45
50
  end
46
51
  ```
52
+   
47
-
53
+ 下記はstores_controller.rb内の記述です。(投稿と画像の反映に関係しそうなactionのみ記述しています。)
48
-
49
- ```ruby
54
+ ```ruby
50
55
  def index
51
56
  @store = Store.includes(:user)
52
57
  end
@@ -72,6 +77,25 @@
72
77
  params.require(:store).permit(:name, {中略}  ,:bgm, images: [] ).merge(user_id: current_user.id)
73
78
  end
74
79
  ```
80
+   
81
+ (追記)
82
+ 以下投稿フォームの記述です。
83
+ ```ruby
84
+ <%= form_with model: store, local: true do |f|%>
85
+
86
+ (中略)
87
+ <div class="field" >
88
+ <%= f.label :images, "店舗画像" %><br />
89
+ <%= f.file_field :images, name: 'message[images][]', id:"store_image" %>
90
+ <div id="image-list"></div>
91
+ </div>
92
+
93
+ <div class="actions">
94
+ <%= f.submit "登録する", class: :form__btn %>
95
+ </div>
96
+ <% end %>
97
+ ```
98
+
75
99
  ### 試したこと
76
100
 
77
101
  モデル内のバリデーションにて:imagesのみ削除し、画像なしで投稿できるか試してみたところその他の情報は正しく保存され、またローカル環境でも正しく表示されていました。