質問編集履歴

4

追記

2019/05/07 09:03

投稿

zendendo
zendendo

スコア43

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

不足情報追加

2019/05/07 09:03

投稿

zendendo
zendendo

スコア43

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

誤字修正

2019/05/05 02:00

投稿

zendendo
zendendo

スコア43

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

誤字修正

2019/05/05 01:51

投稿

zendendo
zendendo

スコア43

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| %><!-- 契約マスタの子モデルである提供詳細マスタへの入力フォーム、ハッシュpovide_detail_mastersに入力内容を入れて渡す-->
165
+ <%= fb.fields_for "povide_detail_masters[]", provide_detail do |f3| %><!-- 契約マスタの子モデルである提供詳細マスタへの入力フォーム-->
166
166
 
167
167
  <tr class="item">
168
168