1
resposta

erro no meu código aula 05 method_missing

SAÍDA: C:\Users\User\Documents\Alura-2017\Ruby\OO>ruby sistema.rb ebook_que_mais_vendeu_por_titulo Programming Ruby Revista de Ruby sistema.rb:35:in <main>': undefined methodtitulo' for nil:NilClass (NoMethodError)

Códigos:será que alguém pode me ajudar?

#imports
require_relative "livro"
require_relative "estoque"


def livro_para_newsletter(livro)
  if livro.ano_lancamento < 1999
    puts "Newnsletter/Liquidação"
    puts livro.titulo
    puts livro.preco
    puts livro.possui_reimpressao?
  end
end

algoritmos = Livro.new("Algoritmos", 100, 1998, true, "Editora", "livro")
arquitetura = Livro.new("Introdução à Arquitetura de Software", 70, 2011, true, "Editora", "livro")
programmer = Livro.new("The Pragmatic Programmer", 100, 1999, true, "Editora", "livro")
ruby = Livro.new("Programming Ruby", 100, 2004, true, "Editora", "livro")
revistona = Livro.new("Revista de Ruby", 10, 2012, true, "Revistas", "revista")
online_arquitetura = Livro.new("Introdução à Arquitetura de Software", 50, 2012, true, "Editora", "ebook")


estoque = Estoque.new
estoque << algoritmos << algoritmos << ruby << programmer << arquitetura << ruby << ruby << revistona << revistona << online_arquitetura
estoque.vende ruby
estoque.vende ruby
estoque.vende ruby
estoque.vende algoritmos
estoque.vende algoritmos
estoque.vende revistona

puts estoque.respond_to?(:ebook_que_mais_vendeu_por_titulo)
puts estoque.livro_que_mais_vendeu_por_titulo.titulo
puts estoque.revista_que_mais_vendeu_por_titulo.titulo
puts estoque.ebook_que_mais_vendeu_por_editora.titulo
require_relative "contador"

class Estoque
  attr_reader :livros
  def initialize
    @livros = []
    @vendas = []
    @livros.extend Contador
  end

  def exporta_csv
    @livros.each do |livro|
      puts livro.to_csv
    end
  end

  def mais_baratos_que(valor)
    @livros.select do |livro|
      livro.preco <= valor
    end
  end

  def total
    @livros.size
  end

  def << (livro)
    @livros << livro if livro
  end

  def vende(livro)
    @livros.delete livro
    @vendas << livro
  end

  def maximo_necessario
    @livros.maximo_necessario
  end

  #def quantidade_de_vendas_de_titulo(produto)
   # @vendas.count {|venda| venda.titulo == produto.titulo}
  #end


  def method_missing(name)
    matcher = name.to_s.match "(.+)_que_mais_vendeu_por_(.+)"
    if matcher
      tipo = matcher[1]
      campo = matcher[2].to_sym
      que_mais_vendeu_por(tipo, &campo)
    else
      super
    end
  end

  def respond_to?(name)
    name.to_s.match("(.+)_que_mais_vendeu_por_(.+)") || super
  end

  private
  def quantidade_de_vendas_por(produto, &campo)
    @vendas.count { |venda| campo.call(venda) == campo.call(produto) }
  end

  def que_mais_vendeu_por(tipo, &campo)
    @vendas.select {|l| l.tipo == tipo}.sort {|v1,v2| 
    quantidade_de_vendas_por(v1, &campo) <=> 
    quantidade_de_vendas_por(v2, &campo)}.last
  end
end
1 resposta

Oi Felipe, pelo que estou vendo no seu código, você está recebendo esse erro por que nenhuma venda foi feita para ebook. Veja que você mandou vender vários livros, mas de todos, temos apenas um ebook que não tem vendas associadas.

Ao tentar fazer esse busca, o ruby não vai encontrar nenhum ebook e por isso terá erros.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software