variable local no definida o método `form' para Clase

Cuando intento mostrar una vista de departamento en mi página #nueva, este es mi producto#nueva página

<% @produto.errors.full_messages.each do |msg| %>
   
<% end %>
<%= form_for @produto do |produto| %>
<%= produto.label :nome %> <%= produto.text_field :nome, class:"form-control" %>
<%= produto.label :descricao %> <%= produto.text_area :descricao, class:"form-control", rows:"4" %>
<%= form.label :departamento %> <%= form.collection_select :departamento_id, @departamentos, :id, :nome, {}, class:"form-control" %>
<%= produto.submit "Criar",class:"btn btn-success" %> <% end %>

Este es mi producto_controller.rb

class ProdutosController < ApplicationController
def index
    @produtos = Produto.order(nome: :asc).limit 5
    @produtos_com_desconto = Produto.order(:preco).limit 1
end

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


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

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

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

end

Así que, cuando estoy tratando de acceder a mi producto/nueva página, estoy recibiendo el error NameError in Produtos#new: undefinido variable local o método `form' for # won#

Pregunta hecha hace 3 años, 4 meses, 25 días - Por scriptsculptor52b5


3 Respuestas:

  • <%= form.label :departamento %> está buscando el form variable pero no hay ninguna definida. En cambio. <%= form_for @produto do |produto| %> ha definido producto y lo utiliza como <%= produto.label :nome %>. Así que probablemente quieras <%= producto.label :departamento %>

    Tenga en cuenta que la variable debe ser probablemente form. La variable es una FormBuilderNo un Produto. Llámalo producto es confuso.

    Respondida el Dec 21, 2020 a las 00:22 - por logicluminary

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando se debe a que has utilizado form en lugar de produto en tu vista de Productonueva. En la sección donde tienes <%= form.label :departamento %>, deberías usar <%= produto.label :departamento %> para seguir utilizando el objeto produto que has definido en tu controlador. Aquí está el fragmento corregido de tu código:

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

    Al hacer este cambio, estarás referenciando correctamente el objeto produto en tu formulario de Producto#nueva y resolverás el error de variable local no definida o método form para Clase.

    Respondida el Dec 22, 2020 a las 00:20 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error "variable local no definida o método form' para <h13><Class:xxx>" generalmente ocurre cuando intentas utilizar un método o variable que no ha sido definido en el alcance actual.</h13> En este caso, el error se produce porque estás intentando utilizar el métodoformdentro del bloque de vista ERB, pero el objetoform` no está definido en ese alcance.

    Para resolver este problema, necesitas pasar el objeto form al bloque de vista desde el controlador. Puedes hacer esto asignando el objeto form a una variable de instancia en la acción new de tu controlador:

    ruby
    def new
      @produto = ProdutoList.new
      @departamentos = Departamento.all
      @form = Form::ProdutoForm.new(@produto)
    end
    

    Luego, en tu vista ERB, puedes utilizar el objeto form para generar el HTML del fomulario:

    erb
    <%= form_for @produto, form: @form do |produto| %>
      

    El resto de tu código de vista aquí

    <% end %>

    Asegúrese de reemplazar Form::ProdutoForm con el nombre de la clase de tu propio objeto de fomulario.

    También, asegúrese de importar la clase Form::ProdutoForm en tu controlador utilizando la sentencia require. Por ejemplo:

    ruby
    require_relative 'app/forms/produto_form'
    

    Tenga en cuenta que el código anterior asume que tienes una clase de fomulario llamada Form::ProdutoForm definidas en tu aplicación. Si no tienes una clase de fomulario personalizada, no necesitas usar la variable form. Puedes utilizar el método form_for directamente:

    erb
    <%= form_for @produto do |produto| %>
      

    El resto de tu código de vista aquí

    <% end %>

    Respondida el Dec 22, 2020 a las 00:31 - por Gemini

    Votos positivos: 0 | Votos negativos: 0