質問編集履歴

1

ご指摘ありがとうございます。断片ではなく、それぞれのファイルを記載し直しました。ご確認のほど、よろしくお願いします。

2022/05/05 01:47

投稿

izu_reco
izu_reco

スコア2

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
- # 入力項目のvalidationはこのファイルに記述している
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
- errors = []
93
+ is_success = true
31
- # Foodクラスの中でどれか1つでも例外が発生すると、ロールバックしてくれる。登録するかしないかのどちらか。
32
94
  Food.transaction do
33
- # フォーム入力されたオブジェクトのfoods(3つの食材が配列として格納されている)を1つずつDBに保存する
34
- self.foods.map do |food|
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
- errors << food.errors.full_messages
96
+ is_success = false unless result.save
39
- end
40
97
  end
41
- # もし入力箇所に誤りがあった場合は、Rollbackし、transactionから抜け出す
42
- raise ActiveRecord::Rollback if errors.present?
98
+ raise ActiveRecord::RecordInvalid unless is_success
43
99
  end
100
+
44
- # errorsに値があれば、falseとエラー文を戻す
101
+ rescue
45
- if errors.present?
102
+ p 'error'
103
+ ensure
46
- return false, errors
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