質問編集履歴
4
コードを追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -218,7 +218,107 @@
|
|
218
218
|
|
219
219
|
```
|
220
220
|
|
221
|
-
|
221
|
+
追記
|
222
|
+
|
223
|
+
account_transactionsのコントローラです。
|
224
|
+
|
225
|
+
ここで、AccountTransactionとDepositsAndWithdrawalにレコードを作成し、
|
226
|
+
|
227
|
+
BasicIncomeAccountの更新を同時かつトランザクション処理でできるようにしております。
|
228
|
+
|
229
|
+
(ポイント振替処理ができるようになっています)
|
230
|
+
|
231
|
+
/app/controllers/account_transactions_controller.rb
|
232
|
+
|
233
|
+
```ここに言語を入力
|
234
|
+
|
235
|
+
AccountTransaction.transaction do
|
236
|
+
|
237
|
+
#取引モデルにレコードを作成保存
|
238
|
+
|
239
|
+
@account_transaction = AccountTransaction.new(
|
240
|
+
|
241
|
+
withdrawal_account_id: current_user.basic_income_account.id,
|
242
|
+
|
243
|
+
deposit_account_id: BasicIncomeAccount.find_by(account_number: params[:account_transaction][:deposit_account_id]).id,
|
244
|
+
|
245
|
+
amount: params[:account_transaction][:amount]
|
246
|
+
|
247
|
+
)
|
248
|
+
|
249
|
+
@account_transaction.save!
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
DepositsAndWithdrawal.transaction do
|
254
|
+
|
255
|
+
#入出金モデルに出金側レコードを作成保存
|
256
|
+
|
257
|
+
@account_transaction.deposits_and_withdrawals.build(
|
258
|
+
|
259
|
+
transaction_type: "出金",
|
260
|
+
|
261
|
+
basic_income_account_id: current_user.basic_income_account.id,
|
262
|
+
|
263
|
+
amount: -1 * params[:account_transaction][:amount].to_f
|
264
|
+
|
265
|
+
)
|
266
|
+
|
267
|
+
@account_transaction.save!
|
268
|
+
|
269
|
+
#入出金モデルに出金側レコードを作成保存
|
270
|
+
|
271
|
+
@account_transaction.deposits_and_withdrawals.build(
|
272
|
+
|
273
|
+
transaction_type: "入金",
|
274
|
+
|
275
|
+
basic_income_account_id: BasicIncomeAccount.find_by(account_number: params[:account_transaction][:deposit_account_id]).id,
|
276
|
+
|
277
|
+
amount: params[:account_transaction][:amount].to_f
|
278
|
+
|
279
|
+
)
|
280
|
+
|
281
|
+
@account_transaction.save!
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
BasicIncomeAccount.transaction do
|
286
|
+
|
287
|
+
#出金口座と入金口座の残高を更新する
|
288
|
+
|
289
|
+
@withdrawal_basic_income_account = current_user.basic_income_account
|
290
|
+
|
291
|
+
@deposit_basic_income_account = BasicIncomeAccount.find_by(account_number: params[:account_transaction][:deposit_account_id])
|
292
|
+
|
293
|
+
|
294
|
+
|
295
|
+
@withdrawal_amount = params[:account_transaction][:amount].to_f
|
296
|
+
|
297
|
+
@deposit_amount = params[:account_transaction][:amount].to_f
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
@withdrawal_basic_income_account.update(balance: @withdrawal_basic_income_account.balance - @withdrawal_amount)
|
302
|
+
|
303
|
+
@deposit_basic_income_account.update(balance: @deposit_basic_income_account.balance + @deposit_amount)
|
304
|
+
|
305
|
+
end
|
306
|
+
|
307
|
+
end
|
308
|
+
|
309
|
+
end
|
310
|
+
|
311
|
+
#トランザクション処理が完全成功なら、root_path(ホーム画面)へ飛ぶ
|
312
|
+
|
313
|
+
redirect_to root_path
|
314
|
+
|
315
|
+
#トランザクション処理で例外発生(失敗)したら、以下の例外処理を実行する
|
316
|
+
|
317
|
+
rescue => e
|
318
|
+
|
319
|
+
render plain: e.message
|
320
|
+
|
321
|
+
```
|
222
322
|
|
223
323
|
|
224
324
|
|
3
質問文を訂正する
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
|
3
3
|
ruby(ruby on rails)で、ポイント振替機能みたいなものをつくっていているのですが、
|
4
4
|
|
5
|
+
2つの問題が起きてしまっています。
|
6
|
+
|
5
|
-
残高以上の数値を入力しても取引が実行されてしまうので、
|
7
|
+
一つ目は残高以上の数値を入力しても取引が実行されてしまうので、
|
6
8
|
|
7
9
|
「**モデルのvalidates(検証)で、支払ユーザー(現在ログインしているユーザー)が保有する口座残高以下の取引額のみ検証成功**」にしたいと思っています。
|
8
10
|
|
@@ -26,6 +28,10 @@
|
|
26
28
|
|
27
29
|
|
28
30
|
|
31
|
+
2つ目の問題は、入力フォームでマイナスの取引額を入力してしまうと、出金処理と入金処理が逆転してしまうので、「**入力フォームでマイナス数値の入力を不可**」にしたいと思っているのですが、フォーム側で制限ってできるのでしょうか?それとも、モデル側で制限した方がいいのでしょうか?
|
32
|
+
|
33
|
+
|
34
|
+
|
29
35
|
教えて頂ければ幸いです。
|
30
36
|
|
31
37
|
|
@@ -36,7 +42,7 @@
|
|
36
42
|
|
37
43
|
入力フォームです。
|
38
44
|
|
39
|
-
|
45
|
+
ユーザーは、口座番号と送金額だけ入力しています。
|
40
46
|
|
41
47
|
app/views/account_transactions/new.html.erb
|
42
48
|
|
@@ -52,7 +58,7 @@
|
|
52
58
|
|
53
59
|
<%= f.label :送金額 %>
|
54
60
|
|
55
|
-
<%= f.number_field
|
61
|
+
<%= f.number_field %>
|
56
62
|
|
57
63
|
<%= f.submit"送金確認" %>
|
58
64
|
|
2
図を変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -12,19 +12,9 @@
|
|
12
12
|
|
13
13
|
図にするとこんな感じです。
|
14
14
|
|
15
|
+
|
16
|
+
|
15
|
-
![イメージ説明](38
|
17
|
+
![イメージ説明](3e3fd016583c2efc5cdef8e7e1357c81.png)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
18
|
|
29
19
|
例えば、AccountTransactionモデルにamount(取引額)を記録する前に、ログインユーザーの保有する残高が記録されたBasicIncomeAccountモデルのbalance(残高)を参照して、
|
30
20
|
|
1
質問を少し簡潔にする
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,52 +1,38 @@
|
|
1
1
|
###前提・実現したいこと
|
2
2
|
|
3
|
-
ruby(ruby on rails)で、ポイント振替機能みたいなものをつくっていて、
|
3
|
+
ruby(ruby on rails)で、ポイント振替機能みたいなものをつくっていているのですが、
|
4
|
+
|
4
|
-
|
5
|
+
残高以上の数値を入力しても取引が実行されてしまうので、
|
6
|
+
|
7
|
+
「**モデルのvalidates(検証)で、支払ユーザー(現在ログインしているユーザー)が保有する口座残高以下の取引額のみ検証成功**」にしたいと思っています。
|
8
|
+
|
9
|
+
|
10
|
+
|
5
|
-
|
11
|
+
ただ、残高を記録するモデルと取引額を記録するモデルは別々に分かれています。
|
6
|
-
|
7
|
-
|
8
|
-
|
12
|
+
|
9
|
-
図にするとこんな感じで
|
13
|
+
図にするとこんな感じです。
|
10
|
-
|
14
|
+
|
11
|
-
![イメージ説明](
|
15
|
+
![イメージ説明](38761438c8459adbf27afb2a38d883f5.png)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
|
16
|
-
|
17
|
-
|
17
|
+
|
18
|
-
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
19
|
-
|
29
|
+
例えば、AccountTransactionモデルにamount(取引額)を記録する前に、ログインユーザーの保有する残高が記録されたBasicIncomeAccountモデルのbalance(残高)を参照して、
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
30
|
+
|
24
|
-
|
25
|
-
「**支払ユーザー(現在のログインユーザー)の口座残高以上の取引額の記録は無効**」
|
26
|
-
|
27
|
-
「
|
31
|
+
「入力された値が残高以下なら検証成功として記録」
|
32
|
+
|
28
|
-
|
33
|
+
「入力された値が残高以上なら検証失敗として記録しない」
|
34
|
+
|
29
|
-
にしたい
|
35
|
+
ようにしたいのですのですが、やり方がわからず困っています。
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
一つ目の問題の場合・・・
|
34
|
-
|
35
|
-
例えば「取引モデル」へ保存する際に、validates(検証作業)が行われるわけですが、
|
36
|
-
|
37
|
-
今回の場合、他のモデルの値(ログインユーザーが保有する口座モデルの残高)を
|
38
|
-
|
39
|
-
取引モデルの検証作業に組み込んで、「口座残高以上の取引額は無効」
|
40
|
-
|
41
|
-
とするにはどうすればいいのでしょうか?
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
2つ目の問題の場合、
|
46
|
-
|
47
|
-
入力フォームで正の数値しか入力できないようにする方法はあるのでしょうか?
|
48
|
-
|
49
|
-
|
50
36
|
|
51
37
|
|
52
38
|
|
@@ -60,12 +46,12 @@
|
|
60
46
|
|
61
47
|
入力フォームです。
|
62
48
|
|
49
|
+
ちなみに、正の値1~999999999しか入力できないようにしています。
|
50
|
+
|
63
51
|
app/views/account_transactions/new.html.erb
|
64
52
|
|
65
53
|
```ここに言語を入力
|
66
54
|
|
67
|
-
|
68
|
-
|
69
55
|
<%= form_for @account_transaction do |f|%>
|
70
56
|
|
71
57
|
<div class="field">
|
@@ -76,7 +62,7 @@
|
|
76
62
|
|
77
63
|
<%= f.label :送金額 %>
|
78
64
|
|
79
|
-
<%= f.number_field :amount %>
|
65
|
+
<%= f.number_field :amount,min:1,max:999999999 %>
|
80
66
|
|
81
67
|
<%= f.submit"送金確認" %>
|
82
68
|
|
@@ -186,6 +172,8 @@
|
|
186
172
|
|
187
173
|
|
188
174
|
|
175
|
+
今回の問題の本題となる取引モデルのコードです。
|
176
|
+
|
189
177
|
app/models/account_transaction.rb
|
190
178
|
|
191
179
|
|
@@ -222,7 +210,7 @@
|
|
222
210
|
|
223
211
|
def balance_check
|
224
212
|
|
225
|
-
if current_user.basic_income_acccount.balance <
|
213
|
+
if current_user.basic_income_acccount.balance < ??????????
|
226
214
|
|
227
215
|
errors.add(:amount, "残高以上の送金はできません")
|
228
216
|
|