質問編集履歴

4

コードを追加

2017/12/06 23:37

投稿

zendendo
zendendo

スコア43

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

質問文を訂正する

2017/12/06 23:37

投稿

zendendo
zendendo

スコア43

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
- ちなみに正の値1~999999999しか入力できないようにしています。
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 :amount,min:1,max:999999999 %> 
61
+ <%= f.number_field %> 
56
62
 
57
63
  <%= f.submit"送金確認" %>
58
64
 

2

図を変更

2017/12/06 22:44

投稿

zendendo
zendendo

スコア43

test CHANGED
File without changes
test CHANGED
@@ -12,19 +12,9 @@
12
12
 
13
13
  図にするとこんな感じです。
14
14
 
15
+
16
+
15
- ![イメージ説明](38761438c8459adbf27afb2a38d883f5.png)
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

質問を少し簡潔にする

2017/12/06 00:50

投稿

zendendo
zendendo

スコア43

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
- 現状では入力フォーム(form_for)に送り取引額を入力すると振替が実行できる状態なっています。
11
+ だ、残高を記録するモデルと取引額を記録するモデルは別々分かれています。
6
-
7
-
8
-
12
+
9
- 図にするとこんな感じで振替が記録・更新されていきます。
13
+ 図にするとこんな感じです。
10
-
14
+
11
- ![イメージ説明](ac32c85412a7460daaacab74ff04c960.png)
15
+ ![イメージ説明](38761438c8459adbf27afb2a38d883f5.png)
12
-
13
-
14
-
15
- しかし、入力される値(取引額)について困っていることが2点ほどあり、
16
+
16
-
17
- 一つ目は、残高以上の取引額を入力しても取引が実行され、残高がマイナスになってしまいます。
17
+
18
-
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
19
- 2つ目はフォーム画面の取引額入力欄(number_field)でマイナス数値の入力されてまうと入金と出金が逆転ししまう問題が発生します。
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