質問編集履歴
5
最終更新日を追加。自己解決法とベストアンサーを決め、本質問はひとまず閉鎖。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
【rails】一対多対一のリレーションを使うフォームで、バリデーションに失敗する(仮)(更新:2108
|
1
|
+
【rails】一対多対一のリレーションを使うフォームで、バリデーションに失敗する(仮)(最終更新:210826)
|
test
CHANGED
File without changes
|
4
確認してみると少し見づらかったので修正しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
【rails】一対多対一のリレーションを使うフォームで、バリデーションに失敗する(仮)
|
1
|
+
【rails】一対多対一のリレーションを使うフォームで、バリデーションに失敗する(仮)(更新:210814)
|
test
CHANGED
@@ -514,7 +514,7 @@
|
|
514
514
|
|
515
515
|
|
516
516
|
|
517
|
-
###
|
517
|
+
### deep_merge
|
518
518
|
|
519
519
|
コードは以下の通りに修正しました。
|
520
520
|
|
@@ -548,7 +548,7 @@
|
|
548
548
|
|
549
549
|
|
550
550
|
|
551
|
-
###
|
551
|
+
### to_h.deep_merge
|
552
552
|
|
553
553
|
|
554
554
|
|
@@ -584,7 +584,7 @@
|
|
584
584
|
|
585
585
|
|
586
586
|
|
587
|
-
###
|
587
|
+
### reverse_merge
|
588
588
|
|
589
589
|
最後はreverse_mergeですが、結果は変わりませんでした。
|
590
590
|
|
3
「試したこと」を追加。
test
CHANGED
File without changes
|
test
CHANGED
@@ -498,9 +498,95 @@
|
|
498
498
|
|
499
499
|
|
500
500
|
|
501
|
-
|
502
|
-
|
503
|
-
|
501
|
+
# 試したこと(更新:210814)
|
502
|
+
|
503
|
+
sefileにuser_idがない、とのご指摘をいただいたので解法を調べていたところ、
|
504
|
+
|
505
|
+
1. deep_merge
|
506
|
+
|
507
|
+
2. to_h.deep_merge(配列に変換した後deep_merge)
|
508
|
+
|
509
|
+
3. reverse_merge
|
510
|
+
|
511
|
+
|
512
|
+
|
513
|
+
の3つがありました。
|
514
|
+
|
515
|
+
|
516
|
+
|
517
|
+
##### deep_merge
|
518
|
+
|
519
|
+
コードは以下の通りに修正しました。
|
520
|
+
|
521
|
+
|
522
|
+
|
523
|
+
/app/controllers/sampler_controller.rb
|
524
|
+
|
525
|
+
```ruby
|
526
|
+
|
527
|
+
def sampler_params
|
528
|
+
|
529
|
+
params.require(:sampler).permit(:sampler_name, seboards_attributes: [:position, :btncolor, :volume, :loopable, sefile_attributes: [:sename, :sedata]]).deep_merge(seboards_attributes:[sefile_attributes:[user_id: current_user.id]])
|
530
|
+
|
531
|
+
end
|
532
|
+
|
533
|
+
|
534
|
+
|
535
|
+
def update_sampler_params
|
536
|
+
|
537
|
+
params.require(:sampler).permit(:sampler_name, seboards_attributes: [:position, :btncolor, :volume, :loopable, sefile_attributes: [:sename, :sedata]]).deep_merge(seboards_attributes:[sefile_attribute:[user_id: current_user.id]])
|
538
|
+
|
539
|
+
end
|
540
|
+
|
541
|
+
|
542
|
+
|
543
|
+
```
|
544
|
+
|
545
|
+
その結果以下のようなエラーが出ました。
|
546
|
+
|
547
|
+
![undifined_merge](cbc81a8a82b97163c5f293bb94981708.png)
|
548
|
+
|
549
|
+
|
550
|
+
|
551
|
+
##### to_h.deep_merge
|
552
|
+
|
553
|
+
|
554
|
+
|
555
|
+
コードは以下の通りに修正しました。
|
556
|
+
|
557
|
+
|
558
|
+
|
559
|
+
/app/controllers/sampler_controller.rb
|
560
|
+
|
561
|
+
```ruby
|
562
|
+
|
563
|
+
def sampler_params
|
564
|
+
|
565
|
+
params.require(:sampler).permit(:sampler_name, seboards_attributes: [:position, :btncolor, :volume, :loopable, sefile_attributes: [:sename, :sedata]]).to_h.deep_merge(seboards_attributes:[sefile_attributes:[user_id: current_user.id]])
|
566
|
+
|
567
|
+
end
|
568
|
+
|
569
|
+
|
570
|
+
|
571
|
+
def update_sampler_params
|
572
|
+
|
573
|
+
params.require(:sampler).permit(:sampler_name, seboards_attributes: [:position, :btncolor, :volume, :loopable, sefile_attributes: [:sename, :sedata]]).to_h.deep_merge(seboards_attributes:[sefile_attribute:[user_id: current_user.id]])
|
574
|
+
|
575
|
+
end
|
576
|
+
|
577
|
+
|
578
|
+
|
579
|
+
```
|
580
|
+
|
581
|
+
その結果以下のようなエラーが出ました。
|
582
|
+
|
583
|
+
![イメージ説明](0652820ffd0186fbe07b24c52b22dd30.png)
|
584
|
+
|
585
|
+
|
586
|
+
|
587
|
+
##### reverse_merge
|
588
|
+
|
589
|
+
最後はreverse_mergeですが、結果は変わりませんでした。
|
504
590
|
|
505
591
|
|
506
592
|
|
2
モデルに問題がある、というご指摘をいただいたため問題のあるseboardモデルと、その下層のsefileモデルのコードを追加いたしました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -332,6 +332,58 @@
|
|
332
332
|
|
333
333
|
|
334
334
|
|
335
|
+
##### /app/models/seboard.rb
|
336
|
+
|
337
|
+
```Ruby
|
338
|
+
|
339
|
+
class Seboard < ApplicationRecord
|
340
|
+
|
341
|
+
belongs_to :sampler,inverse_of: :seboards#, class_name: "Sampler", foreign_key: 'sampler_id'
|
342
|
+
|
343
|
+
|
344
|
+
|
345
|
+
has_one :sefile,inverse_of: :seboard#, class_name: "Sefile", foreign_key: 'sefile_id'
|
346
|
+
|
347
|
+
accepts_nested_attributes_for :sefile
|
348
|
+
|
349
|
+
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
end
|
354
|
+
|
355
|
+
```
|
356
|
+
|
357
|
+
|
358
|
+
|
359
|
+
##### /app/models/sefile.rb
|
360
|
+
|
361
|
+
```Ruby
|
362
|
+
|
363
|
+
class Sefile < ApplicationRecord
|
364
|
+
|
365
|
+
belongs_to :user, class_name: "User", foreign_key: 'user_id'
|
366
|
+
|
367
|
+
|
368
|
+
|
369
|
+
belongs_to :seboard, class_name: "Seboard", foreign_key: 'seboard_id' ,inverse_of: :sefile, optional: true
|
370
|
+
|
371
|
+
|
372
|
+
|
373
|
+
mount_uploader :sedata, SeUploader
|
374
|
+
|
375
|
+
|
376
|
+
|
377
|
+
end
|
378
|
+
|
379
|
+
|
380
|
+
|
381
|
+
```
|
382
|
+
|
383
|
+
|
384
|
+
|
385
|
+
|
386
|
+
|
335
387
|
##### /app/views/sampler/_save.html.erb
|
336
388
|
|
337
389
|
```html
|
1
「おことわり」を更新
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
「[unknown attribute 'XXX' for XXX. で必要ないはず/存在するはずのカラムが要求される](https://teratail.com/questions/353417)」の続きになります。
|
4
4
|
|
5
|
+
そのため、「詰まっている箇所」まで同じ文面が続きます。
|
6
|
+
|
5
7
|
|
6
8
|
|
7
9
|
# 前提
|