質問編集履歴
4
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -301,3 +301,223 @@
|
|
301
301
|
|
302
302
|
|
303
303
|
@provide_detail_mastersには複数の契約詳細レコードが入っており、なおかつ各レコードのattributesには新しい入力内容が入っている状態にしたいのですが、どうすればできるのでしょうか?
|
304
|
+
|
305
|
+
|
306
|
+
|
307
|
+
###追記
|
308
|
+
|
309
|
+
accepts_nested_attributes_forを使った場合のコードです。
|
310
|
+
|
311
|
+
|
312
|
+
|
313
|
+
モデル
|
314
|
+
|
315
|
+
```ここに言語を入力
|
316
|
+
|
317
|
+
class ContractMaster < ApplicationRecord
|
318
|
+
|
319
|
+
#複数の契約マスタは、一人のユーザーに従属している
|
320
|
+
|
321
|
+
belongs_to :user
|
322
|
+
|
323
|
+
|
324
|
+
|
325
|
+
has_many :contracts
|
326
|
+
|
327
|
+
has_many :provide_detail_masters
|
328
|
+
|
329
|
+
#フォームにて子モデルを同時更新する為に追記
|
330
|
+
|
331
|
+
accepts_nested_attributes_for :provide_detail_masters, allow_destroy: true
|
332
|
+
|
333
|
+
accepts_nested_attributes_for :temp_cont_item_stock, allow_destroy: true
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
|
338
|
+
|
339
|
+
end
|
340
|
+
|
341
|
+
```
|
342
|
+
|
343
|
+
|
344
|
+
|
345
|
+
|
346
|
+
|
347
|
+
コントローラ
|
348
|
+
|
349
|
+
```ここに言語を入力
|
350
|
+
|
351
|
+
class ContractMastersController < ApplicationController
|
352
|
+
|
353
|
+
def edit
|
354
|
+
|
355
|
+
#編集したいレコードを取得(フォームに表示する為に)
|
356
|
+
|
357
|
+
@contract_master = current_user.contract_masters.find(params[:id])#親モデルの1件の契約
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
@contract_master1 = EditDractContractForm.new#編集用のフォームオブジェクト
|
362
|
+
|
363
|
+
end
|
364
|
+
|
365
|
+
|
366
|
+
|
367
|
+
def update
|
368
|
+
|
369
|
+
@contract_master1 = EditDractContractForm.new(edit_contract_master_params)
|
370
|
+
|
371
|
+
@contract_master1.edit_contract_master = @contract_master
|
372
|
+
|
373
|
+
@contract_master1_result = @contract_master1.transaction_save#更新実行
|
374
|
+
|
375
|
+
#更新に成功した場合
|
376
|
+
|
377
|
+
if @contract_master1_result
|
378
|
+
|
379
|
+
flash[flash[:success] = '契約を下書き保存しました']
|
380
|
+
|
381
|
+
redirect_to contract_masters_path(id: @contract_master.id)
|
382
|
+
|
383
|
+
#バリデーションエラー、もしくは例外が発生して更新失敗した場合、
|
384
|
+
|
385
|
+
elsif @contract_master1_result == 'validaiton_error' || @contract_master1_result == false
|
386
|
+
|
387
|
+
@contract_master.attributes = edit_contract_master_params#入力内容を渡して保持している
|
388
|
+
|
389
|
+
flash[:danger] = '契約の下書きに失敗しました。'
|
390
|
+
|
391
|
+
render 'edit'
|
392
|
+
|
393
|
+
end
|
394
|
+
|
395
|
+
end
|
396
|
+
|
397
|
+
private
|
398
|
+
|
399
|
+
#契約を編集するためのパラメータ
|
400
|
+
|
401
|
+
def edit_contract_master_params
|
402
|
+
|
403
|
+
|
404
|
+
|
405
|
+
#accepts_nested_attributes_forを使った場合、
|
406
|
+
|
407
|
+
params.require(:edit_dract_contract_form).permit(:name, :contract_text, provide_detail_masters_attributes: [:quantity, :ownership_form_master_id, :id ])
|
408
|
+
|
409
|
+
|
410
|
+
|
411
|
+
end
|
412
|
+
|
413
|
+
end
|
414
|
+
|
415
|
+
```
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
|
420
|
+
|
421
|
+
ビュー
|
422
|
+
|
423
|
+
```ここに言語を入力
|
424
|
+
|
425
|
+
<%= form_for @contract_master, as: :edit_dract_contract_form do |fb| %>
|
426
|
+
|
427
|
+
<% if @contract_master1.errors.any? %><!-- フォームオブジェクトでバリデーションエラーがあるかをチェック。ある場合は、エラーを表示する-->
|
428
|
+
|
429
|
+
<h3>入力内容にエラーが<%= @contract_master1.errors.count %>件あります</h3>
|
430
|
+
|
431
|
+
<ul>
|
432
|
+
|
433
|
+
<% @contract_master1.errors.full_messages.each do |message| %><!-- フォームオブジェクト(契約下書きFO)でのエラーメッセージを取得して、表示する-->
|
434
|
+
|
435
|
+
<li><%= message %></li>
|
436
|
+
|
437
|
+
<% end %>
|
438
|
+
|
439
|
+
</ul>
|
440
|
+
|
441
|
+
<!-- 親モデルへの入力フォーム-->
|
442
|
+
|
443
|
+
<div class="form-group">
|
444
|
+
|
445
|
+
<%= fb.label :契約名, class: "label-inline" %><span class="badge badge-pill badge-danger">必須</span>
|
446
|
+
|
447
|
+
<%= fb.text_field :name, class:'form-control' %>
|
448
|
+
|
449
|
+
</div>
|
450
|
+
|
451
|
+
<div class="form-group">
|
452
|
+
|
453
|
+
<%= fb.label :契約本文, class: "label-inline" %><span class="badge badge-pill badge-danger">必須</span>
|
454
|
+
|
455
|
+
<%= fb.text_area :contract_text, class:'form-control', rows:"5" %>
|
456
|
+
|
457
|
+
</div>
|
458
|
+
|
459
|
+
<h3>契約詳細編集</h3>
|
460
|
+
|
461
|
+
<table class="table">
|
462
|
+
|
463
|
+
<thead>
|
464
|
+
|
465
|
+
<tr>
|
466
|
+
|
467
|
+
<th>アイテム名</th>
|
468
|
+
|
469
|
+
<th>提供数</th>
|
470
|
+
|
471
|
+
<th>提供形態</th>
|
472
|
+
|
473
|
+
</tr>
|
474
|
+
|
475
|
+
</thead>
|
476
|
+
|
477
|
+
<tbody class="bulk-registration-form">
|
478
|
+
|
479
|
+
<!-- 子モデルであり複数ある入力フォーム-->
|
480
|
+
|
481
|
+
<%= fb.fields_for provide_detail_masters do |f3| %><!-- 契約マスタの子モデルである提供詳細マスタへの入力フォーム-->
|
482
|
+
|
483
|
+
<tr class="item">
|
484
|
+
|
485
|
+
<td>
|
486
|
+
|
487
|
+
</td>
|
488
|
+
|
489
|
+
<td>
|
490
|
+
|
491
|
+
<%= f3.number_field :quantity, min:0,max:999999999%>
|
492
|
+
|
493
|
+
</td>
|
494
|
+
|
495
|
+
<td>
|
496
|
+
|
497
|
+
<%= f3.collection_select :ownership_form_master_id, OwnershipFormMaster.where(id: 4..6), :id, :name , {}, {class: 'form-control'} %>
|
498
|
+
|
499
|
+
</td>
|
500
|
+
|
501
|
+
</tr>
|
502
|
+
|
503
|
+
<% end %><!-- 繰り返し作業f3のend(提供詳細マスタへの入力フォームのend)-->
|
504
|
+
|
505
|
+
<% end %>
|
506
|
+
|
507
|
+
</tbody>
|
508
|
+
|
509
|
+
</table>
|
510
|
+
|
511
|
+
|
512
|
+
|
513
|
+
<div class="text-center">
|
514
|
+
|
515
|
+
<%= fb.submit "下書き保存する", name: 'draft_save', class: "btn btn-lg btn-primary" %>
|
516
|
+
|
517
|
+
</div>
|
518
|
+
|
519
|
+
<% end %>
|
520
|
+
|
521
|
+
```
|
522
|
+
|
523
|
+
これで、フォームオブジェクトで更新が失敗してedit画面にrenderしても入力内容を保持することができました。
|
3
不足情報追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -276,7 +276,9 @@
|
|
276
276
|
|
277
277
|
#コントローラ側に追記する
|
278
278
|
|
279
|
+
@provide_detail_masters2 = @contract_master.provide_detail_master#契約詳細取得
|
280
|
+
|
279
|
-
@input_provide_detail_masters = @contract_master1.povide_detail_masters
|
281
|
+
@input_provide_detail_masters = @contract_master1.povide_detail_masters#契約詳細への入力内容取得
|
280
282
|
|
281
283
|
@input_provide_detail_masters.each do |id, ipdm|
|
282
284
|
|
@@ -288,6 +290,14 @@
|
|
288
290
|
|
289
291
|
```
|
290
292
|
|
293
|
+
さらに、この場合ではビュー側の@provide_detail_masters.each do |provide_detail|にて、
|
294
|
+
|
295
|
+
undefined method `each' for #<ProvideDetailMaster:0x007f4c0eaff6c0>
|
296
|
+
|
297
|
+
エラーが発生してしまいます。
|
298
|
+
|
299
|
+
|
300
|
+
|
291
301
|
|
292
302
|
|
293
303
|
@provide_detail_mastersには複数の契約詳細レコードが入っており、なおかつ各レコードのattributesには新しい入力内容が入っている状態にしたいのですが、どうすればできるのでしょうか?
|
2
誤字修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
def edit
|
26
26
|
|
27
|
-
#編集したいレコードを取得(フォームに表示する)
|
27
|
+
#編集したいレコードを取得(フォームに表示する為に)
|
28
28
|
|
29
29
|
@contract_master = current_user.contract_masters.find(params[:id])#親モデルの1件の契約
|
30
30
|
|
@@ -58,7 +58,7 @@
|
|
58
58
|
|
59
59
|
@contract_master.attributes = edit_contract_master_params2#親モデルへの入力内容を保持する
|
60
60
|
|
61
|
-
@provide_detail_masters = @contract_master.provide_detail_masters#子モデルを取得
|
61
|
+
@provide_detail_masters = @contract_master.provide_detail_masters#子モデルを取得,renderしたときのフォームを表示させるために
|
62
62
|
|
63
63
|
###問題個所、複数あるレコードのattributes
|
64
64
|
|
@@ -222,11 +222,11 @@
|
|
222
222
|
|
223
223
|
|
224
224
|
|
225
|
-
#親モデル「契約」への入力内容
|
225
|
+
#親モデル「契約」への入力内容 文字列としてそのまま渡される
|
226
226
|
|
227
227
|
attr_accessor :name, :contract_text
|
228
228
|
|
229
|
-
#子モデル「契約詳細」への入力内容、 複数のハッシュ
|
229
|
+
#子モデル「契約詳細」への入力内容、 複数のハッシュとして渡される
|
230
230
|
|
231
231
|
attr_accessor :povide_detail_masters
|
232
232
|
|
1
誤字修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -162,7 +162,7 @@
|
|
162
162
|
|
163
163
|
<% item = ItemStock.find(provide_detail.item_stock_id) %><!-- 繰り返し入れ替わる詳細レコードのアイテムストックIDからアイテムレコードを取得する -->
|
164
164
|
|
165
|
-
<%= fb.fields_for "povide_detail_masters[]", provide_detail do |f3| %><!-- 契約マスタの子モデルである提供詳細マスタへの入力フォーム
|
165
|
+
<%= fb.fields_for "povide_detail_masters[]", provide_detail do |f3| %><!-- 契約マスタの子モデルである提供詳細マスタへの入力フォーム-->
|
166
166
|
|
167
167
|
<tr class="item">
|
168
168
|
|