ข้อผิดพลาดระดับสแต็กลึกเกินไปทำให้แอปของฉันขัดข้อง ฉันมีรูปแบบการฝากเงินสองแถว: รายได้และการรับเงิน สองแถวนี้แก้ไขโดย after_create การโทรกลับในรูปแบบรายได้และการจ่ายเงิน ในรูปแบบการจ่ายเงิน ฉันต้องการใช้การเรียกกลับ before_create เพื่อตรวจสอบยอดเงินฝาก (ยอดเงินฝากจะต้องมากกว่าหรือเท่ากับ 0 หลังจากสร้างการจ่ายเงิน) และได้รับข้อผิดพลาด: SystemStackError ใน CashoutsController#create
PS: การโทรกลับรายได้ทำงานได้ดี
รหัส:
ฝาก.rb
class Deposit < ActiveRecord::Base
belongs_to :user
has_many :incomes
has_many :cashouts
end
สคีมา.rb
...
create_table "deposits", force: true do |t|
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
t.decimal "income", precision: 12, scale: 2
t.decimal "cashout", precision: 12, scale: 2, default: 0.0
end
cashout.rb
class Cashout < ActiveRecord::Base
belongs_to :deposit
validates :deposit_id, :order_sum, presence: true
validates :order_sum, numericality: true
validates :order_sum, numericality: { greater_than_or_equal_to: 0}
before_create :validate_order #before_save crashed too
after_create :update_deposit_cashout # working fine
private
def validate_order
@deposit = self.deposit
@income = @deposit.income
@cashout = self.order_sum
if @income - @cashout >= 0
self.save
else
!self.save
end
end
def update_deposit_cashout
@deposit = self.deposit
@deposit.update_attributes(:cashout => @cashout + self.order_sum)
end
end
cashouts_controller.rb
class CashoutsController < ApplicationController
before_action :signed_in_user, only: [:create]
def new
@cashout = @deposit.cashouts.build
end
def create
@deposit = current_user.deposit
@cashout = @deposit.cashouts.build(cashout_params)
@cashout.save
if @cashout.save
flash[:success] = "Your order request has been sent!"
redirect_to '/deposit'
else
flash[:error] = "Your order request hasn't been sent!"
redirect_to '/deposit'
end
end
def show
@deposit = Deposit.find(params[:id])
@deposit.cashout
end
private
def cashout_params
params.require(:cashout).permit(:order_sum)
end
end
รายได้.rb
class Income < ActiveRecord::Base
belongs_to :deposit
validates :deposit_id, :order_sum, presence: true
validates :order_sum, numericality: true
validates :order_sum, numericality: { greater_than_or_equal_to: 0}
after_create :update_deposit_income
private
def update_deposit_income
@deposit = self.deposit
if @deposit.income == nil
@income = 0
else
@income = @deposit.income
end
@deposit.update_attributes(:income => @income + self.order_sum)
end
end
Incomes_controller.rb
class IncomesController < ApplicationController
before_action :signed_in_user, only: [:create]
def new
@income = @deposit.incomes.build
end
def create
@user = current_user
@deposit = @user.deposit
@income = @deposit.incomes.build(income_params)
@income.save
if @income.save
flash[:success] = "Your order request has been sent!"
redirect_to '/deposit'
else
flash[:error] = "Your order request hasn't been sent!"
redirect_to '/deposit' if current_user.present?
end
end
def show
@deposit = Deposit.find(params[:id])
@deposit.income
end
private
def income_params
params.require(:income).permit(:order_sum)
end
end
ความผิดพลาดของฉันอยู่ที่ไหน?