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
相关产品推荐
相关产品推荐

