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

undefined method `nome' for nil:NilClass

Depois de fazer a aula de produtos por departamento, comecei a receber esse erro ao entrar na minha index de produtos.

NoMethodError in Produtos#index
Showing /home/rodrigo/projetos/loja/app/views/produtos/_produto.html.erb where line #4 raised:

undefined method `nome' for nil:NilClass
Extracted source (around line #4):

 2   <td><%= produto.nome %></td>
3   <td><%= produto.descricao %></td>
4    <td><%= produto.departamento.nome %></td>
5    <td><%= produto.preco %></td>
6    <td><%= produto.quantidade %></td>
7    <td><%= link_to  "Alterar", edit_produto_path(produto), class: "btn btn-default" %></td>

Já procurei em produtos_controller e não consigo achar porque estou tomando esse erro. Não consigo entender porque produto.departamento.nome` está vindo nulo...

Poderiam me ajudar por favor?

2 respostas

Segue meu produtos_controller

class ProdutosController < ApplicationController

    before_action :set_produto, only: [:edit, :update, :destroy]

    def index
        @produtos = Produto.order :nome
        @produto_com_desconto = Produto.order(:preco).limit 1
    end

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

    def edit
        renderiza :edit
    end

    def create        
        @produto = Produto.new produto_params
        if @produto.save
            flash[:notice] = "Produto criado com sucesso"
            redirect_to root_url
        else
            renderiza :new
        end
    end

    def update
        if @produto.update produto_params
            flash[:notice] = "Produto atualizado com sucesso"
            redirect_to root_url
        else
            renderiza :edit
        end

    end

    def destroy
        @produto.destroy
        redirect_to root_url

    end

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

    private

    def produto_params
        params.require(:produto).permit(:nome, :descricao, :preco, :quantidade, :departamento_id)
    end

    def set_produto
        @produto = Produto.find(params[:id])
    end

    def renderiza(view)
        @departamento = Departamento.all
        render view    
    end
end
solução!

Descobri o problema. Eu tinha um produto "vestido" que pertencia a um departamento "moda feminina", daí apaguei o departamento, então quando ia pra tela de Index, o produto vestido procurava um nome pra um departamento que não existia, então retornava que Nil não tem nome. Resolvi colocando um if na linha:

<td>
        <% if produto.departamento %>
        <%= produto.departamento.nome %>
        <% end %>
    </td>

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