Rails7新增产品注册页面报错:NoMethodError - undefined method
问题排查与修复
核心问题
你的DespensaController缺少new方法,Rails访问despensa/new路由时找不到对应的控制器动作,这是表单页面无法打开的直接原因。此外,视图中的表单输入框命名不符合Rails参数嵌套规范,会导致后续创建产品时参数获取失败。
修复步骤
1. 给控制器添加new动作
修改despensa_controller.rb,添加new方法实例化空产品对象,供表单使用:
class DespensaController < ApplicationController def index @produtos = Produto.order :nome @produto_menor_quantidade = Produto.order(:quantidade).limit 1 end def new @produto = Produto.new end def create produto_params = params.require(:produto).permit(:nome, :quantidade, :unidade_de_medida) Produto.create(produto_params) redirect_to root_path # 创建完成后重定向到首页,避免重复提交 end end
2. 修正视图表单的输入框命名
手动编写的input标签没有嵌套在produto参数下,会导致create动作中params.require(:produto)报错。改用form_for提供的helper方法生成输入框:
<html> <body> <%= form_for @produto do |form|%> Nome <%= form.text_field :nome %><br/> Quantidade <%= form.number_field :quantidade, step: "0.01" %><br/> Unidade de medida <%= form.text_field :unidade_de_medida %><br/> <%= form.submit "Adicionar produto" %> <% end %> </body> </html>
3. 可选:改用RESTful风格路由(推荐)
将路由配置改为Rails标准的RESTful格式,更简洁且符合惯例:
Rails.application.routes.draw do resources :despensa, only: [:index, :new, :create] root to: "despensa#index" end
说明
- 添加
new方法是因为Rails的GET路由需要对应控制器中的同名动作,负责渲染表单页面。 - 使用
form_for的helper方法会自动生成正确的参数命名(如produto[nome]),确保create动作能正确获取嵌套参数。 - RESTful路由自动映射标准的动作与路径,减少手动配置的出错概率。
内容的提问来源于stack exchange,提问作者Clarice Almeida
相关产品推荐
相关产品推荐

