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

undefined method `nome' for nil:NilClass

Ao add departamento.nome recebo esse erro na tela. " undefined method `nome' for nil:NilClass "

Tentei fazer o produto = Produto.find(id do produto em questão), que vi em outro topico aqui, porem onde eu posso ver o id dos meus produtos?

6 respostas

Olá Bruna, como vai?

Pode por gentileza compartilhar algumas informações do seu projeto:

  • Como está o código da index
  • E o código da controller
  • Qual banco de dados você está utilizando?

: )

Codigo na index e controle estão abaixo, o banco de dados é o mesmo sugerido no projeto, postgres

<% if flash[:notice]%>
    <div class="alert alert-success" role="alert">
        <%= flash[:notice] %>
    </div>
<%end%>
<table class="table table-bordered table-hover">
    <thead>
        <tr>
            <td>Titulo</td>
            <td>Ator principal</td>
            <td>Nota</td>
            <td>Ano</td>
            <td>Genero </td>
            <td colspan="2">
        </tr>
    </thead>
    <tbody>
    <%@filmes.each do |filme|%>
        <tr>
            <td><%= filme.titulo %></td>
            <td><%= filme.atorprincipal %></td>
            <td><%= filme.nota %></td>
            <td><%= filme.ano %></td>
            <td><%= filme.genero %></td>
            <td><%= button_to "Remover", filme, method: :delete, class:"btn btn-danger", data: {confirm: "Tem certeza que deseja deletar o filme #{filme.titulo}?"} %></td>
            <td><%= link_to "Alterar", edit_filme_path(filme), class: "btn btn-default" %> </td>
        </tr>
        <%end%>
    </tbody>
</table>
<div class="alert alert-success" role="alert">
    <h4 class="alert-heading">Filmes com maiores notas </h4>
</div>
<table class="table table-bordered table-hover">
    <thead>
        <tr>
            <td>Titulo</td>
            <td>Ator principal</td>
            <td>Nota</td>
            <td>Ano</td>
        </tr>
    </thead>
    <tbody>
    <%@filmes_com_maior_nota.each do |filme|%>
        <tr>
            <td><%= filme.titulo %></td>
            <td><%= filme.atorprincipal %></td>
            <td><%= filme.nota %></td>
            <td><%= filme.ano %></td>
        </tr>
        <%end%>
    </tbody>
</table>

Codigo na controller está assim:

class FilmesController < ApplicationController
    def index 
        @filmes = Filme.order :nota
        @filmes_com_maior_nota = Filme.order(nota: :desc).limit 2
    end

    def new
        @filme = Filme.new
        @generos = Genero.all
    end

    def create
        atributos = params.require(:filme).permit(:titulo, :atorprincipal, :nota, :ano, :genero_id)
        @filme = Filme.new atributos
        if @filme.save
            flash[:notice] = "Filme salvo com sucesso!"
            redirect_to root_url
        else
            render :new
        end
    end

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

    def busca
        @titulo = params[:titulo]
        @filmes = Filme.where "titulo like ?", "%#{@titulo}%"
    end

    def edit
        id = params [:id]
        @filme = Filme.find(id)
        @generos = Genero.all
        render :new

    end

    def update 
        id = params[:id]
        @filme = Filme.find(id)
        @generos = Genero.all
        atributos = params.require(:filme).permit(:titulo,
        :atorprincipal, :nota, :ano, :genero_id)
        if @produto.update atributos
            flash[:notice] = "Filme atualizado com sucesso!"
            redirect_to root_url
        else
            @generos = Filme.all
            render :new
        end
    end

end

Acho que essa nil class ta impactando na hora de implementar o def edit, pois recebo o erro "wrong number of arguments (given 1, expected 0)" na linha onde tenho id = params [:id]

Oi, Bruna, tudo bem?

Muito obrigado por compartilhar seu código.

Para conferir os ids no dos filmes no banco, você por usar o comando rails console no terminal para acessar o console da aplicação, em seguida faça os passos:

`filmes = Filme.all

Ou abrir seu PGAdmin e acessar a tabela de filmes também, clicando em cima da tabela com botão direito e escolhendo a opção all rows.

Porém, parece que esse erro ocorre por conta de filmes que não possuem gênero, especificamente nesse trecho:

<td><%= filme.genero %></td>

Se possível, peço por gentileza que verifique se todos os filmes possuem um gênero e no lugar de exibir o id, sugiro o nome do gênero:

<td><%= filme.genero.nome %></td>

Realize esses teste e fale o resultado que teve. Conte sempre com a Alura.

: )

solução!

Consegui resolver com um

<%= filme.genero.nome unless filme.genero.nil? %>
na minha partial de filme

Parabéns Bruna, fico feliz que conseguiu!

Bons estudos e conte com a Alura!

: )