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

Carregando página em branco

Olá,

Estou com um problema ao tentar alterar um produto. Quando clico no botão "Alterar" a url do produto muda para "http://localhost:3000/produtos/3/edit", por exemplo, porém os campos são carregados em branco, os dados do produtos não são carregados.

Eu não sei o que possa está acontecendo de errado no código. Alguém teria ideia?

Método edit e update do meu Controller

def edit
    set_produto
    renderiza :edit

    end

def update
    set_produto

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

private

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

    def renderiza(view)
        @departamentos = Departamento.all
        render view
end
6 respostas

Olá, tudo bem?

Como está a sua view do formulário de editar?

O restante parece correto.

Oi Henrique,

A view está assim:

_form.htm.erb ( que possui o texto da ação editar ou deletar)

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

<% end %>

edit.html.erb

<%= render partial: 'form', locals: {texto_da_acao: 'Atualizar o produto'} %>

_produto.html.erb

   <tr>
        <td><%= produto.nome %></td>
        <td><%= produto.descricao %></td>
       <td><%= produto.preco %></td>
        <td><%= button_to "Remover", produto, method: :delete, class: "btn btn-danger", data: {confirm: "Tem certeza que deseja remover #{produto.nome}?"} %></td>
        <td><%= link_to "Alterar", edit_produto_path(produto), class: "btn btn-default" %></td>
    </tr>

A _form não veio completa, ela deve ser a view com o problema. Depois cola ela toda aqui?

Você pode clicar no botão Inserir Código pra colar um código formatado.

Oi Henrique, Peço desculpas, não tinha conseguido organizar o código, espero que tenha melhorado. Segue meu _form.html.erb.

<% @produto.errors.full_messages.each do |message| %>
<div class="alert alert-danger role="alert"><%=message%></div> 
<% 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 class="form-group">
    <%= f.label :departamento %>
    <%= f.collection_select :departamento_id,  Departamento.all , :id, :nome, {}, class: "form-control" %>

</div>

</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, class: "form-control"%>

</div> 
<%= f.submit texto_da_acao, class: "btn btn-primary"  %>
</div>

<% end %>
solução!

Olá, voltei :)

Nota que no seu form_for você está criando sempre um Produto novo, isso fere o MVC e como você quer usar o form como uma partial agora isso não vai funcionar mais.

Porque quando você quer editar, tem que carregar o produto a ser editado no form e não um novo produto.

Para solucionar o problema você pode fazer algumas mudanças no Controller:

Na action new:

def new
  @produto = Produto.new
end

Aqui nós criamos uma variável que vale um produto novo para que possamos usá-la depois.

Na action edit:

def edit
  set_produto
end

Aqui temos que carregar o produto a ser editado.

Na chamada da partial agora vamos inserir a nova variável @produto:

# view de new
<%= render partial: 'form', locals: { texto_da_acao: 'Criar produto', produto: @produto } %>

# view de edit
<%= render partial: 'form', locals: { texto_da_acao: 'Atualizar o produto', produto: @produto } %>

Como você viu no locals nós declaramos a variável produto que recebe o valor @produto.

Na partial _form, troque essas linhas:

<% produto.errors.full_messages.each do |message| %>
<div class="alert alert-danger role="alert"><%=message%></div> 
<% end %>
<%= form_for produto do |f| %> 

para usar a sua nova variável produto o restante fica igual.

Se ficar alguma dúvida estou por aqui :)

Oi Henrique,

Entendi sua explicação. Alterei conforme você sugeriu e deu tudo certo, solucionou! Obrigada!