質問
DEFはメソッド名を返します。だからあなたは
を書くことができますprivate def foo
p "foo is private"
end
.
しかし、私はより困難な方法でエラーが発生しました:
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|
^
.
プライベートなしこのDEFは次のように戻ります。refresh_prices。誰かがそれが失敗した理由を説明することができ、それは私的なdefを使用するのは悪い方法ですか?
解決
それは面白いです。DO / ENDブロックが構文エラーを引き起こしているように見えます。
{}
スタイルのブロックを使用すると、予想通りに機能します。
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
.
バグと見なすことができると思います。Rubyバグトラッカーに報告があるかどうかがわかります。
編集: Ruby 2.1のバグです(バグ#9308 )。現在のRubyバージョンで修正されましたので、次のバグ修正リリースで利用可能になります。
今の場合は、DO / ENDの代わりに{}
ブロックスタイルを使用するだけです。
所属していません StackOverflow