简单计算会导致Ruby中的语法错误

时间:2013-02-06 23:50:54

标签: ruby-on-rails ruby syntax-error

我在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错误。见下面的答案。

2 个答案:

答案 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,但绝对需要/和数字之间的空格。