【发布时间】:2019-08-12 16:54:13
【问题描述】:
我有一个模型接受它所属的另一个模型的嵌套属性。
class Order < ApplicationRecord
belongs_to :customer, required: true
belongs_to :collection_address,
class_name: 'Address',
foreign_key: :collection_address_id
accepts_nested_attributes_for :collection_address
end
我的控制器如下所示:
def update
@order = Order.find(params[:id])
@collection_address = @order.collection_address || @order.build_collection_address
if @order.update(strong_params)
flash[:success] = 'Order updated'
redirect_to order_path(@order)
else
flash.now[:warning] = @order.errors.full_messages
render 'edit'
end
end
我的编辑表单如下所示:
<h1>Edit order</h1>
<%= simple_form_for @order, url: order_path do |form| %>
<%= form.simple_fields_for @collection_address do |address_form| %>
<%= address_form.input :address1 %>
<%= address_form.input :address2 %>
<%= address_form.input :city %>
<%= address_form.input :postcode %>
<% end %>
<%= form.button :submit %>
<% end %>
但是当我尝试加载页面时,Rails 失败并出现错误:
Completed 500 Internal Server Error in 128ms (ActiveRecord: 1.9ms | Allocations: 7986)
ActionView::Template::Error (undefined method `model_name' for nil:NilClass):
1: <h1>Edit order</h1>
2: <%= simple_form_for @order, url: order_path do |form| %>
3: <%= form.simple_fields_for @collection_address do |address_form| %>
4: <%= address_form.input :address1 %>
5: <%= address_form.input :address2 %>
6: <%= address_form.input :city %>
actionview (6.0.0.rc2) lib/action_view/model_naming.rb:11:in `model_name_from_record_or_class'
actionview (6.0.0.rc2) lib/action_view/helpers/form_helper.rb:2170:in `fields_for'
simple_form (4.1.0) lib/simple_form/action_view_extensions/builder.rb:28:in `simple_fields_for'
...
嵌套字段肯定会导致这种情况,因为当我删除嵌套表单时,页面会正确加载。我能想到的只是它与具有与其关联名称不同的类名称的关联有关(即,关联是:collection_address,但它的类名称是Address)。
从这里开始,我完全陷入困境。有谁知道为什么我的表格无法加载?我错过了什么明显的东西吗?我需要采取额外的步骤吗?如何让表单使用 collection_address 的嵌套属性?
【问题讨论】:
-
您提供了更新操作,但我怀疑
@collection_address未在您的编辑操作中定义 -
你是对的。我累了。
标签: ruby-on-rails simple-form nested-attributes