0

私は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

そして、これがどこから来ているのか、私にはアイデアがありません。コードに問題はまったくありません。私は複数の関数に非常によく似たコードを持っており、それぞれがわずかに異なる方法で計算を行っています。しかし、これだけが問題です。

多分それはカフェインの不足です。このコードに何か問題がありますか?これを引き起こしているファイルに何か他のものがありますか?どうすればデバッグを進めることができますか?

乾杯!

編集:私はそれを理解しました。Rubynoobの間違い。以下の回答を参照してください。

4

2 に答える 2

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
于 2013-02-07T00:01:03.107 に答える
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 / 100myVar/ 100/

于 2013-02-07T19:29:05.453 に答える