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

使用Partial复用表单时默认执行Create而非Update,且Category视图报错

Rails 复用表单Partial遇到的问题及解决

问题场景

尝试用Partial复用表单,同时处理关联Category的Expense的创建与编辑操作:

  • 创建功能正常,但编辑表单提交时始终执行创建操作,提交按钮默认显示「Create Expense」而非「Update Expense」
  • 在Category详情页渲染创建表单时,报错:undefined method 'model_name' for nil:NilClass

路由为嵌套资源结构:categories下嵌套expenses,包含完整RESTful路由。

相关代码片段

Category详情页跳转至Expense编辑页

<% @category.expenses.each do |expense| %>
  <tr>
    <td><%= expense.name %></td>
    <td>
      <%= link_to "Edit", edit_category_expense_path(@category, expense) %>
    </td>
  </tr>
<% end %>

Expense编辑视图(app/views/expenses/edit.html.erb)

<h1>Edit Expenses</h1>
<%= render "form", expense: @expense %>

表单Partial(app/views/expenses/_form.html.erb)

<%= form_with model: [ @category, @expense] do |form| %>
  <p>
    <%= form.label :name %><br>
    <%= form.text_field :name %>
  </p>  
  <p>
    <%= form.submit %>
  </p>
<% end %>

Expense控制器相关方法

def edit
  @expense = Expense.find(params[:id])
  @category = @expense.category
end

def new
  @expense = @category.expenses.new
end

Category详情页渲染创建表单

<h2>Add Expense:</h2>
<%= render 'expenses/form' %>

解决步骤

在Category控制器的show方法中添加初始化@expense的代码:

def show
  # 保留原有业务代码
  @expense = Expense.new
end

添加后,两个问题均得到解决:

  1. 编辑表单的提交按钮会正确显示「Update Expense」,提交时执行更新操作
  2. Category详情页的创建表单可正常渲染,不再出现model_name报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:25:17