Pergunta

def agora retorna o nome do método.Então você pode escrever

private def foo
  p "foo is private"
end

mas tive um erro com um método mais 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|
                  ^

sem private este def retorna:refresh_prices.Alguém pode explicar por que ele falha e é uma maneira ruim de usar a definição privada?

Foi útil?

Solução

É interessante.Parece que o bloco do/end está causando um erro de sintaxe.

Se você usar o {}bloco de estilo, funciona conforme o esperado.

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 

Acredito que possa ser considerado um bug.Vou ver se há algum relatório sobre o rastreador de bugs do Ruby.


EDITAR: Confirmo que é um bug do Ruby 2.1 (veja erro #9308).Foi corrigido na versão atual do Ruby, portanto estará disponível na próxima versão de correção de bugs.

Por enquanto, basta usar o {} estilo de bloco em vez de fazer/fim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top