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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top