Pregunta

def ahora devuelve el nombre del método.Entonces puedes escribir

private def foo
  p "foo is private"
end

pero tuve un error con un método más difícil:

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|
                  ^

sin privado, esta definición devuelve:refresh_prices.¿Alguien puede explicar por qué falla y si es una mala forma de utilizar la defensa privada?

¿Fue útil?

Solución

Es interesante.Parece que el bloque do/end está provocando un error de sintaxis.

Si usas el {}-bloque de estilo, funciona como se esperaba.

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 

Creo que podría considerarse un error.Veré si hay algún informe sobre el rastreador de errores de Ruby.


EDITAR: Confirmo que es un error de Ruby 2.1 (ver error #9308).Se ha solucionado en la versión actual de Ruby, por lo que estará disponible en la próxima versión de corrección de errores.

Por ahora, simplemente use el {} estilo de bloque en lugar de hacer/finalizar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top