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| %>
<%= 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 elform
variable pero no hay ninguna definida. En cambio.<%= form_for @produto do |produto| %>
ha definidoproducto
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ámaloproducto
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 deproduto
en tu vista de Productonueva. En la sección donde tienes Aquí está el fragmento corregido de tu código:<%= form.label :departamento %>
, deberías usar<%= produto.label :departamento %>
para seguir utilizando el objetoproduto
que has definido en tu controlador.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étodoform
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étodo
formdentro del bloque de vista ERB, pero el objeto
form` 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 objetoform
a una variable de instancia en la acciónnew
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 sentenciarequire
. 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 variableform
. Puedes utilizar el métodoform_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