Erreur de défaut privée sur Ruby 2.1
Question
def est maintenant renvoyé le nom de la méthode.Afin que vous puissiez écrire
private def foo
p "foo is private"
end
Mais j'avais une erreur avec une méthode plus difficile:
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|
^
sans privé ce def renvoie: rafraîchissez_prices.Quelqu'un peut-il expliquer pourquoi il échoue et est-ce un mauvais moyen d'utiliser privé def?
La solution
C'est intéressant.On dirait que le bloc DO / End provoque une erreur de syntaxe.
Si vous utilisez le bloc de style généracodageCode, cela fonctionne comme prévu.
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
Je crois que cela pourrait être considéré comme un bug.Je verrai s'il y a un rapport sur le tracker de bogues Ruby.
EDIT: Je confirme que c'est un bug ruby 2.1 (voir #9308 ).Il a été corrigé dans la version actuelle Rubis, elle sera donc disponible dans la prochaine version de la bugfix.
Pour l'instant, utilisez simplement le style de bloc GeneraCoDiCodeTagcode au lieu de do / fin.