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

Ruby 2.7.0+Rails 6.1单视图放两个post表单出现nil报错如何解决

错误原因

你遇到的First argument in form cannot contain nil or be empty报错,核心原因是:表单提交后调用render :new返回页面时,仅初始化了当前提交对应的表单实例变量,另一个表单的实例变量为nil。
比如提交进口表单时,控制器只会给@border_rotation_import赋值,@border_rotation_export没有被初始化,渲染new视图时第一个表单调用form_for @border_rotation_export就会因为参数为空报错。

修复方案

1. 控制器create方法补全实例变量初始化

修改create方法逻辑,在渲染new页面前,给未使用的另一个表单也初始化空实例:

def create
    if params[:export_submit]
      @border_rotation_export = BorderRotationExport.new(border_rotation_export_params)
      respond_to do |format|
        if @border_rotation_export.save
          flash[:success] = "出口记录创建成功"
          @border_rotation_import = BorderRotationImport.new
          format.html { render :new }
          else
          flash[:error] = "出口记录创建失败"
          @border_rotation_import = BorderRotationImport.new
          format.html { render :new }
        end
      end
    else
      @border_rotation_import = BorderRotationImport.new(border_rotation_import_params)
      respond_to do |format|
        if @border_rotation_import.save
          flash[:success] = "进口记录创建成功"
          @border_rotation_export = BorderRotationExport.new
          format.html { render :new }
          else
          flash[:error] = "进口记录创建失败"
          @border_rotation_export = BorderRotationExport.new
          format.html { render :new }
        end
      end
    end
  end 

2. 给表单提交按钮添加name属性

需要给两个表单的提交按钮显式指定name,确保控制器的判断条件能正常生效:
出口表单的提交按钮:

<%= f.submit "提交出口记录", name: "export_submit", class: "btn btn-primary" %>

进口表单的提交按钮:

<%= f.submit "提交进口记录", name: "import_submit", class: "btn btn-primary" %>

3. 删除多余的GET路由

路由中定义的get 'rotation/create'完全冗余,create动作仅用来处理POST提交请求,直接删除该行即可,避免用户直接访问GET路径触发异常。

额外优化点

当前代码中进口表单保存成功后的提示文字写的是"Export successfully created",可修改为对应的进口提示,避免用户混淆。

内容的提问来源于stack exchange,提问作者DefaultBot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:36:01