嗨,我是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只会插入表单中提交的值。
如何从表单提交现金箱余额和银行余额,并将更新后的值存储在表格中? 另外,请建议是否有更好的方法来做到这一点。
答案 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
值作为网络请求的一部分,然后应用交易的价值你创建它来为你的银行提供交易价值。当然,我不确定你的具体要求,但这似乎是一个潜在的问题方法。或许是一个不同的问题)。