【问题标题】:Rails: Why do I get the error "undefined method `model_name'" when trying to use nested attributes?Rails:为什么我在尝试使用嵌套属性时会收到错误“未定义的方法 `model_name'”?
【发布时间】: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


【解决方案1】:

我需要在编辑操作中定义@collection_address

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多