質問編集履歴
1
ご指摘ありがとうございます。断片ではなく、それぞれのファイルを記載し直しました。ご確認のほど、よろしくお願いします。
test
CHANGED
File without changes
|
test
CHANGED
@@ -11,49 +11,137 @@
|
|
11
11
|
## 該当のソースコード
|
12
12
|
① コントローラー
|
13
13
|
```Ruby
|
14
|
+
class FoodsController < ApplicationController
|
15
|
+
def new
|
16
|
+
@form = Form::FoodCollection.new(params[:box_id])
|
17
|
+
end
|
18
|
+
|
14
19
|
def create
|
15
20
|
@form = Form::FoodCollection.new(food_collection_params)
|
16
21
|
if @form.save == true
|
17
22
|
redirect_to root_path, notice: "商品を登録しました"
|
18
23
|
else
|
19
|
-
# 入力箇所にエラーがあった場合、以下②のFormオブジェクトのsaveメソッドから、falseが戻ってくるので、再度入力フォームを表示させている。
|
20
24
|
render :new
|
21
25
|
end
|
22
26
|
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def food_collection_params
|
31
|
+
params.require(:form_food_collection)
|
32
|
+
.permit(:food_title, :number_title, :purchase_date, :expiry_date, :price, :give_id)
|
33
|
+
.merge(
|
34
|
+
box_id: params[:box_id]
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
23
38
|
```
|
24
39
|
|
25
40
|
②Formオブジェクトモデル
|
26
41
|
```Ruby
|
42
|
+
# Base
|
43
|
+
class Form::Base
|
44
|
+
include ActiveModel::Model
|
45
|
+
include ActiveModel::Callbacks
|
46
|
+
include ActiveModel::Validations
|
47
|
+
include ActiveModel::Validations::Callbacks
|
48
|
+
end
|
49
|
+
|
50
|
+
# Baseを継承したFoodCollectionモデル
|
51
|
+
class Form::FoodCollection < Form::Base
|
52
|
+
FORM_COUNT = 3 #ここで、作成したい登録フォームの数を指定
|
53
|
+
attr_accessor(
|
54
|
+
:foods,
|
55
|
+
:food_title, :number_title, :purchase_date, :expiry_date, :price, :give_id,
|
56
|
+
:box_id
|
57
|
+
)
|
58
|
+
|
59
|
+
with_options presence: true do
|
60
|
+
validates :food_title
|
61
|
+
validates :number_title
|
27
|
-
|
62
|
+
validates :purchase_date
|
63
|
+
validates :expiry_date
|
64
|
+
validates :price
|
65
|
+
validates :give_id
|
66
|
+
end
|
67
|
+
|
68
|
+
# 初期化メソッド
|
69
|
+
|
70
|
+
def initialize(box_id, attributes = [])
|
71
|
+
if attributes.present?
|
72
|
+
self.foods = attributes.map do |value|
|
73
|
+
Food.new(
|
74
|
+
food_title: value["food_title"],
|
75
|
+
number_title: value["number_title"],
|
76
|
+
purchase_date: value["purchase_date"],
|
77
|
+
expiry_date: value["expiry_date"],
|
78
|
+
price: value["price"],
|
79
|
+
give_id: value["give_id"],
|
80
|
+
box_id: value["box_id"]
|
81
|
+
)
|
82
|
+
end
|
83
|
+
else
|
84
|
+
self.foods = FORM_COUNT.times.map { Food.new }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def persisted?
|
89
|
+
false
|
90
|
+
end
|
28
91
|
|
29
92
|
def save
|
30
|
-
e
|
93
|
+
is_success = true
|
31
|
-
# Foodクラスの中でどれか1つでも例外が発生すると、ロールバックしてくれる。登録するかしないかのどちらか。
|
32
94
|
Food.transaction do
|
33
|
-
# フォーム入力されたオブジェクトのfoods(3つの食材が配列として格納されている)を1つずつDBに保存する
|
34
|
-
self.foods.
|
95
|
+
self.foods.each do |result|
|
35
|
-
f = Food.new(box_id: box_id)
|
36
|
-
food.box_id = f.box_id
|
37
|
-
if !food.save
|
38
|
-
|
96
|
+
is_success = false unless result.save
|
39
|
-
end
|
40
97
|
end
|
41
|
-
# もし入力箇所に誤りがあった場合は、Rollbackし、transactionから抜け出す
|
42
|
-
raise ActiveRecord::Rol
|
98
|
+
raise ActiveRecord::RecordInvalid unless is_success
|
43
99
|
end
|
100
|
+
|
44
|
-
|
101
|
+
rescue
|
45
|
-
|
102
|
+
p 'error'
|
103
|
+
ensure
|
46
|
-
return
|
104
|
+
return is_success
|
47
|
-
else
|
48
|
-
return true
|
49
|
-
end
|
50
105
|
end
|
51
106
|
```
|
52
107
|
③View
|
53
108
|
```Ruby
|
109
|
+
<div class="items-sell-main">
|
110
|
+
<h2>冷蔵庫に入っている食材を入力しよう!</h2>
|
111
|
+
<div id="div_default"><h2>上の食材カテゴリを選んでね</h2>
|
112
|
+
</div>
|
113
|
+
|
54
|
-
<%= form_with model: @form, url: box_foods_path, method: :post, local: true do |f| %>
|
114
|
+
<%= form_with model: @form, url: box_foods_path, method: :post, local: true do |fr| %>
|
55
|
-
<% binding.pry %>
|
56
|
-
<%= render 'shared/error_messages', model: f.object %>
|
115
|
+
<%= render 'shared/error_messages', model: fr.object %>
|
116
|
+
<div id="div_fish">
|
117
|
+
<%# <%= render partial: 'shared/fields_for', locals:{ form: form } %>
|
118
|
+
<h2>選択されている食材カテゴリ : <i class="fa-solid fa-fish"></i>Fish </h2>
|
119
|
+
<table class="item-table">
|
120
|
+
<thead>
|
121
|
+
<tr class="item-tr">
|
122
|
+
<th>魚の食材名</th>
|
123
|
+
<th>個数</th>
|
124
|
+
<th>購入日</th>
|
125
|
+
<th>消費期限</th>
|
126
|
+
<th>購入価格</th>
|
127
|
+
<th>不要チェック</th>
|
128
|
+
</tr>
|
129
|
+
</thead>
|
130
|
+
|
131
|
+
<tbody>
|
132
|
+
<%= fr.fields_for :foods do |f| %>
|
133
|
+
<tr>
|
134
|
+
<td><%= f.text_field :food_title %></td>
|
135
|
+
<td><%= f.number_field :number_title, min: 1, max: 99 %></td>
|
136
|
+
<td><%= f.date_field :purchase_date %></td>
|
137
|
+
<td><%= f.date_field :expiry_date %></td>
|
138
|
+
<td><%= f.text_field :price %></td>
|
139
|
+
<td><%= f.check_box :give_id, {}, "true", "false" %></td>
|
140
|
+
</tr>
|
141
|
+
<% end %>
|
142
|
+
</tbody>
|
143
|
+
</table>
|
144
|
+
</div>
|
57
145
|
```
|
58
146
|
▼renderのエラーメッセージ部分
|
59
147
|
```Ruby
|