質問

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の代わりに{}ブロックスタイルを使用するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top