我在Ruby中有一个简单的财务应用程序,可以跟踪用户的费用并根据它们生成报告。
费用属于不同的类别,这会影响每项费用中的税额。
在我生成费用报告的代码中,我有这篇文章:
tax_totals = [0] * 13
totals = [0] * 13
expenses.each do |expense|
tax_ratio = tax_rate/(1+tax_rate)
category = Category.find(expense.category_id).first
tax_ratio *= category.tax_rate.to_f / 100
if !expense.rate_id.nil?
subcategory = Rate.where("id = ?", expense.rate_id).first
tax_ratio *= subcategory.tax_rate.to_f
end
tax_totals[expense.transaction_date.to_date.month] +=
(expense.amount * tax_ratio)
totals[expense.transaction_date.to_date.month] += expense.amount
end
我在第tax_ratio = tax_rate/(1+tax_rate)
行上一直收到语法错误:
syntax error, unexpected '(', expecting keyword_end
如果删除该行,则错误将移至tax_ratio *= category.tax_rate.to_f / 100
行:
syntax error, unexpected tINTEGER, expecting keyword_end
我没有想法,这是来自哪里。我根本没有看到代码有什么问题。我在多个函数中有非常相似的代码,每个函数的计算略有不同。但只有这一个是一个问题。
可能是缺乏咖啡因。这段代码有问题吗?文件中是否还有其他内容导致此问题?我该如何进行调试?
干杯!
编辑:我明白了。 Ruby noob错误。见下面的答案。答案 0 :(得分:1)
如上所述,这是有效的Ruby。我能够将您的代码放入方法并调用它。见下文:
require 'active_support/all'
require 'rspec'
class Category
def self.find(category_id)
[new]
end
def tax_rate
0.5
end
end
class Rate
def self.where(*args)
[new]
end
def tax_rate
0.5
end
end
def ratio(expenses, tax_rate)
tax_totals = [0] * 13
totals = [0] * 13
expenses.each do |expense|
tax_ratio = tax_rate/(1+tax_rate)
category = Category.find(expense.category_id).first
tax_ratio *= category.tax_rate.to_f / 100
if !expense.rate_id.nil?
subcategory = Rate.where("id = ?", expense.rate_id).first
tax_ratio *= subcategory.tax_rate.to_f
end
tax_totals[expense.transaction_date.to_date.month] +=
(expense.amount * tax_ratio)
totals[expense.transaction_date.to_date.month] += expense.amount
end
end
describe "#ratio" do
let(:expense) do
double("expense", category_id: 5, rate_id: 6, transaction_date: 5.days.ago, amount: 5)
end
let(:expenses) { [expense] }
let(:tax_rate) { 0.25 }
it "should run" do
ratio(expenses, tax_rate)
end
end
答案 1 :(得分:0)
我是Ruby和Rails的新手,对我而言,这是有史以来最奇怪的事情。
这个错误来自于这样一个看似无辜的线条,我甚至都懒得把它包含在原来的问题中。
tax_rate
是一个传递给该方法的变量。它作为整数存储在DB中,因此我需要将其转换为小数点。这是更完整的代码:
tax_rate = tax_rate.to_f /100
tax_totals = [0] * 13
totals = [0] * 13
expenses.each do |expense|
tax_ratio = tax_rate/(1+tax_rate)
category = Category.find(expense.category_id).first
tax_ratio *= category.tax_rate.to_f / 100
if !expense.rate_id.nil?
subcategory = Rate.where("id = ?", expense.rate_id).first
tax_ratio *= subcategory.tax_rate.to_f
end
tax_totals[expense.transaction_date.to_date.month] +=
(expense.amount * tax_ratio)
totals[expense.transaction_date.to_date.month] += expense.amount
end
第一行是Ruby不喜欢的,我仍然不知道为什么。但是你不能myVar /100
它必须myVar / 100
甚至myVar/ 100
,但绝对需要/
和数字之间的空格。