Private Def-Fehler unter Ruby 2.1
Frage
def gibt jetzt den Methodennamen zurück.Damit Sie schreiben können
private def foo
p "foo is private"
end
aber ich hatte einen Fehler mit der schwierigeren Methode:
2.1.1p2 :036 > private def refresh_prices
2.1.1p2 :037?> orders = order_items.includes(:book)
2.1.1p2 :038?> sum = 0
2.1.1p2 :039?> orders.each do |t|
2.1.1p2 :040 > t.price = t.book.price
2.1.1p2 :041?> sum += t.price * t.quantity
2.1.1p2 :042?> t.save
2.1.1p2 :043?> end
2.1.1p2 :044?> self.total_price = sum
2.1.1p2 :045?> save
2.1.1p2 :046?> end
SyntaxError: (irb):39: syntax error, unexpected keyword_do_block, expecting keyword_end
orders.each do |t|
^
ohne private gibt diese Def :refresh_prices zurück.Kann jemand erklären, warum es fehlschlägt und ob es eine schlechte Möglichkeit ist, private Def zu verwenden?
Lösung
Das ist interessant.Es sieht so aus, als ob der Do/End-Block einen Syntaxfehler verursacht.
Wenn Sie die verwenden {}
-style-Block, es funktioniert wie erwartet.
private def refresh_prices
orders = order_items.includes(:book)
sum = 0
orders.each { |t|
t.price = t.book.price
sum += t.price * t.quantity
t.save
}
self.total_price = sum
save
end
# => Object
Ich glaube, dass es sich um einen Fehler handeln könnte.Ich werde nachsehen, ob es einen Bericht zum Ruby-Bug-Tracker gibt.
BEARBEITEN: Ich bestätige, dass es sich um einen Ruby 2.1-Fehler handelt (siehe Fehler #9308).Es wurde in der aktuellen Ruby-Version behoben und wird daher in der nächsten Bugfix-Version verfügbar sein.
Nutzen Sie vorerst einfach die {}
Blockstil statt do/end.