使用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
添加后,两个问题均得到解决:
- 编辑表单的提交按钮会正确显示「Update Expense」,提交时执行更新操作
- Category详情页的创建表单可正常渲染,不再出现
model_name报错
内容的提问来源于stack exchange,提问作者Julien LeGa
相关产品推荐
相关产品推荐

