You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:35:20