使用rails

时间:2016-02-17 11:45:39

标签: ruby-on-rails ruby

嗨,我是Rails的新手。如果这是一个愚蠢的问题,请原谅。

我正在开展一个项目,我需要在交易中计算银行余额和现金箱余额。所以这取决于交易的类型"借方/贷方"和付款方式"在线支付/支票/现金"。只涉及一个模型,即交易模型和交易表。所以这就是我正在做的事情,

transactions_controller

def create      

        @transaction = Transaction.create(transaction_params)

        @amount = transaction_params[:amount].to_f
        @cashbox = transaction_params[:cashbox].to_f
        @bank = transaction_params[:bank].to_f

        if transaction_params[:t_type] == "Debit"
            if transaction_params[:t_method] == "Cash"
                @cashbox -= @amount
                transaction_params[:cashbox] = @cashbox.to_s

            else
                @bank -= @amount
                transaction_params[:bank] = @bank.to_s

            end
        elsif transaction_params[:t_type] == "Credit"
            if transaction_params[:t_method] == "Cash"
                @cashbox += @amount
                transaction_params[:cashbox] = @cashbox.to_s

            else
                @bank += @amount
                transaction_params[:bank] = @bank.to_s

            end
        end

    if @transaction.save
        redirect_to @transaction
    else
        render 'new'
    end
end

def transaction_params
    params.require(:transaction).permit(:date, :notes, :t_type, :t_method, :amount, :paid_by, :paid_to, :cashbox, :bank, :house_id, :expense_for)
end`

交易模型

class Transaction < ActiveRecord::Base
end

但是当我提交包含所有值的表单时,计算部分不会发生,rails只会插入表单中提交的值。

如何从表单提交现金箱余额和银行余额,并将更新后的值存储在表格中? 另外,请建议是否有更好的方法来做到这一点。

3 个答案:

答案 0 :(得分:0)

您需要在渲染之前将此功能放入模型并更新对象(如果我理解正确的话)。现在,您永远不会将更改保存到对象中。

答案 1 :(得分:0)

你的逻辑很混乱,让我们阅读更多有关铁路的信息 - 首先:你不能保存,之后再创建交易。
- 第二:你创建了交易,下面没有看到更新该交易当然应该没有改变。



试试吧:

def create      

    @amount = transaction_params[:amount].to_f
    @cashbox = transaction_params[:cashbox].to_f
    @bank = transaction_params[:bank].to_f

    if transaction_params[:t_type] == "Debit"
        if transaction_params[:t_method] == "Cash"
            @cashbox -= @amount
            transaction_params[:cashbox] = @cashbox.to_s

        else
            @bank -= @amount
            transaction_params[:bank] = @bank.to_s

        end
    elsif transaction_params[:t_type] == "Credit"
        if transaction_params[:t_method] == "Cash"
            @cashbox += @amount
            transaction_params[:cashbox] = @cashbox.to_s

        else
            @bank += @amount
            transaction_params[:bank] = @bank.to_s

        end
    end

    @transaction = Transaction.new transaction_params
    if @transaction.save
      redirect_to @transaction
    else
      render 'new'
    end

def transaction_params     params.require(:transaction).permit(:date,:notes,:t_type,:t_method,:amount,:paid_by,:paid_to,:cashbox,:bank,:house_id,:expense_for) end`

答案 2 :(得分:0)

我认为你有一些困惑:

1)if @transaction.save

在这里,您尝试保存交易,只有在成功完成后才会继续。 @transaction在哪里设置?大概是某种before_filter,但我怀疑在这种情况下你不需要它。

2)@transaction = Transaction.create(transaction_params)

现在,您正在根据从表单提交的参数创建并保存到数据库中的新Transaction对象(但仅当它通过验证时)。

3)然后你做了大量的工作来计算一些看似是交易参数的参数。此时,您已经使用提交的参数创建了事务对象。您将所有这些添加到主要用于传递Web请求参数的params哈希中(是的,您可以将其用于其他内容,但我还要避免这样做)。

现在,最简单的修复方法可能是在您的所有参数更改后移动Transaction.create行,因为您将使用所需的参数创建一个事务。但我不会提倡这一点。看起来这个代码会更好地转移到Transaction模型,并且有一个方法可以在您构建事务之后将值应用于事务。

(我还要问你是否已将你的建模设置得恰到好处。你似乎在传递@bank值作为网络请求的一部分,然后应用交易的价值你创建它来为你的银行提供交易价值。当然,我不确定你的具体要求,但这似乎是一个潜在的问题方法。或许是一个不同的问题)。