Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Criando select na view: erro ao tentar salvar produto.

Quando tento salvar o produto então ocorre o seguinte erro: NoMethodError in Produtos#create...

...

undefined method `map' for nil:NilClass ...

No trecho:

<%=f.collection_select :departamento_id, @departamentos, :id, :nome, {}, class: "form-control"%>

Realizei e revisei todos os passos da aula (associação através do belongs_to, também adicionei o campo departamento_id ao create do ProdutoController e etc), mas não funcionou esta última parte. Estou utilizando a versão do rails 5.0.0.1 e ruby 2.3.1p112. Por favor, qual a possível solução para este problema?

6 respostas

Olá!

O erro está acontecendo pois o atributo @departamentos está nulo.

Posta aqui como está o seu ProdutosController, o método que carrega o form tem que ter feito a busca dos departamentos e preenchido esse atributo.

Abraço!

Olá

class ProdutosController < ApplicationController
  def index
    @produtos_por_nome = Produto.order(:nome).limit 5
    @produtos_por_preco = Produto.order(:preco).limit 5
  end

  def create
    valores = params.require(:produto).permit(:nome, :descricao, :quantidade, :preco, :departamento_id)
    @produto = Produto.create valores
    if @produto.save
      flash[:notice] = "Produto salvo com sucesso!"
      redirect_to root_url
    else
      render :new
    end
  end

  def new
    @produto = Produto.new
    @departamentos = Departamento.all
  end

  def destroy
    id = params[:id]
    Produto.destroy id
    redirect_to root_url
  end

  def busca
    @nome_a_buscar = params[:nome]
    @produtos = Produto.where "nome like ?", "%#{@nome_a_buscar}%"
  end
end

Se você executa no rails console o comando Departamento.all, retorna alguma coisa?

Sim. Retorna todos os departamentos cadastrados.

irb(main):001:0> Departamento.all
  Departamento Load (1.1ms)  SELECT "departamentos".* FROM "departamentos"
=> #<ActiveRecord::Relation [#<Departamento id: 1, nome: "Serie de TV", created_at: "2016-11-02 19:41:39", updated_at: "2016-11-02 19:41:39">, #<Departamento id: 2, nome: "Informática", created_at: "2016-11-02 20:10:00", updated_at: "2016-11-02 20:10:00">, #<Departamento id: 3, nome: "Vestiário", created_at: "2016-11-02 20:10:19", updated_at: "2016-11-02 20:10:19">]>
solução!

Boa tarde! Consegui resolver. Esse bug acontece quando, por exemplo, o campo quantidade não passava na validação. De alguma forma a variável de instância @departamentos era perdida na atualização da página new para mostrar a mensagem do alert-danger do campo quantidade. Para contornar isso substitui no form a variável @departamentos por Departamento.all e também a removi do ProdutoController.

Outra solução que testei foi apenas a adição da variável @departamentos = Departamento.all no método create do ProdutoController. Funciona, porém ficou redundante essa parte.

Acredito que as soluções não sejam as mais elegantes, no entanto eram tudo que precisava para prosseguir e finalizar o curso.

Boa noite, Só para registro o "Departamento.all" também me salvou :)