Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails。堆栈级别太深错误_Ruby On Rails_Model - Fatal编程技术网

Ruby on rails RubyonRails。堆栈级别太深错误

Ruby on rails RubyonRails。堆栈级别太深错误,ruby-on-rails,model,Ruby On Rails,Model,堆栈级别太深错误使我的应用程序崩溃。 我有一个两行存款模型:收入和兑现。 这两行由after_修改,在收入和兑现模型中创建回调。 在兑现模型中,我想使用创建前回调来验证存款余额(创建兑现后存款余额必须大于或等于0)并接收错误: 现金输出控制器中的SystemStackError#创建 注:收入回收工作很好 代码: 存款.rb class Deposit < ActiveRecord::Base belongs_to :user has_many :incomes h

堆栈级别太深错误使我的应用程序崩溃。 我有一个两行存款模型:收入和兑现。 这两行由after_修改,在收入和兑现模型中创建回调。 在兑现模型中,我想使用创建前回调来验证存款余额(创建兑现后存款余额必须大于或等于0)并接收错误: 现金输出控制器中的SystemStackError#创建

注:收入回收工作很好

代码:

存款.rb

class Deposit < ActiveRecord::Base
    belongs_to :user
    has_many :incomes
    has_many :cashouts
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
class Cashout=0
自救
其他的
!自救
结束
结束
def更新\存款\兑现
@存款
@存款.更新属性(:兑现=>@cashout+self.order\u sum)
结束
结束
兑现控制器.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
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
class cashoutcontroller
收入.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
class-Income@income+self.order\u sum)
结束
结束
控制程序.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
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
class IncomesController

我的错误在哪里?

堆栈级别太深
错误通常是因为代码卡在循环中:一个方法调用自身,或者两个方法重复调用对方

在您的情况下,我认为这是由
validate\u order
方法引起的。您正在save
回调之前的
中调用它,该方法调用
self.save
,这将触发回调,它将再次调用该方法,它将再次保存,它将触发回调等

请想一想——将对象保存为其“保存前”功能的一部分是没有意义的,不是吗

我猜想您要做的是验证对象,如果验证失败,将自动阻止保存。像这样的

validate :validate_order

def validate_order
  @deposit = self.deposit
  @income = @deposit.income
  @cashout = self.order_sum
  if @income - @cashout <= 0
    self.errors.add(:deposit, "is too small")
  end
end
验证:验证订单
def验证单
@存款
@收入=@deposit.income
@兑现=自订单金额
如果@income-@兑现