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

Aula internacionalização Ruby on Rails do Zero à Web

Estou recebendo o seguinte erro:

NoMethodError in Produtos#new

Showing C:/Sites/relatorioturno/app/views/produtos/new.html.erb where line #1 raised:

undefined method `errors' for nil:NilClass

Rails.root: C:/Sites/relatorioturno
Application Trace | Framework Trace | Full Trace

app/views/produtos/new.html.erb:1:in `_app_views_produtos_new_html_erb___132319139_76930896'

Request

Parameters:

None

Toggle session dump
Toggle env dump
Response

Headers:

None

O meu Controller é esse:

class ProdutosController < ApplicationController

    def index
        @produtos_por_nome = Produto.order(:nome).limit 5
        @produtos_por_preco = Produto.order(:preco).limit 2
    end

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

    def create
        valores = params.require(:produto).permit :nome, :preco, :descricao, :quantidade 
        @produto = Produto.new valores
            if @produto.save
               redirect_to root_url
            else
                render :new
            end
    end

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

E o meu New.html.erb:

<% @produto.errors.full_messages.each do |message| %>

<%= message %>

<% end %>

<%= form_for Produto.new do |f| %>

    <div class="form-group">
    <%= f.label :nome %>
    <%= f.text_field :nome, class: "form-control" %>
</div>

<div class="form-group">

    <%= f.label :descricao %>

    <%= f.text_area :descricao, class: "form-control", rows: 4 %>

</div>

<div class="form-inline">

<div class="form-group">

    <%= f.label :quantidade %>

    <%= f.number_field :quantidade, step: 1, class: "form-control" %>

</div>

<div class="form-group">    

    <%= f.label :preco %>

    <%= f.number_field :preco, step: 0.01, class: "form-control" %>

</div>

    <%= f.submit "Criar o Produto", class: "btn btn-primary" %>

</div>

    <% end %>

</form>
</body>
</html>

O que está errado?

4 respostas
solução!

Oi Edrisan, tudo bem? A primeira linha do seu form é que está causando o erro. Veja:

<% @produto.errors.full_messages.each do |message| %>

Neste caso, o objeto produto deveria ser criado no controller para que o formulário tivesse acesso. Por que você está tentando acessar um objeto que ainda não foi criado. Há duas formas de resolver:

1 - Você cria o método no controller que cria o objeto produto relativo a esta view.

2 - você pode usar um if na view:

<% if @produto %>
    <% @produto.errors.full_messages.each do |message| %>

      <%= message %>

    <% end %>
<% end %>

Testa e vê se funciona?

Wanderson,

Funcionou com a segunda opção! Mas, quando eu faço

@produto = Produto.new valores

if @produto.save

redirect_to root_url

não está sendo criado um produto?

Queria entender porque na vídeo aula funcionou do jeito que eu te mandei o código inicialmente e desde já agradeço pela ajuda!!!

Sim, mas as ações new e create são diferentes. new abre o formulário e o create salva o produto no banco.

o create quando renderiza a view new, ele tem o objeto do controller, mas quando voce acessa o new pela primeira vez, de forma direta, ele não tem esse objeto, por isso dá erro.

Ok Wanderson,

Agora entendido, mais um vez agradeço pela sua ajuda!!! Vou continuar avançando!!!!

Grande abraço!!!