Rails 具有嵌套属性的 nil:nilClass 的未定义方法 'model_name'

Rails undefined method 'model_name' for nil:nilClass with nested attributes

我的 orders/edit.html.erb 中有一个这样开头的表格:

<%= simple_form_for [@reservation, @order] do |f| %>

订单控制器:

def edit
  @reservation = Reservation.find_by_id(params[:reservation_id])
  @order       = Order.find_by_id(params[:id])
end

协会:

预订:has_one订单

路线:

resources :reservations do
  resources :orders 
end

如果我的路径类似于 /reservations/10/orders/10/edit 我最终会从 Rails 得到一个错误说 NoMethodError in Orders#editundefined method 'model_name' for nil:NilClass

当我创建新订单时,表格工作得很好,所以不确定为什么我突然收到错误,有人可以帮我解决这个问题吗?

当 URL 提供了无效的预订 ID 或订单 ID 时,当前的实施很容易失败。两种处理方式:

首先,让Rails为您完成:

def edit
  @reservation = Reservation.find(params[:reservation_id])
  @order       = Order.find(params[:id])
end

这将引发一个 ActiveRecord::RecordNotFound 错误,在生产环境中,该错误应该会将用户引导至您的 404 页面。

如果您希望保留 find_by_id 并手动处理此问题,或者以不同的方式解决此错误,您可以执行以下操作:

def edit
  @reservation = Reservation.find_by_id(params[:reservation_id])
  @order       = Order.find_by_id(params[:id])

  if @reservation.nil? || @order.nil?
    raise ActiveRecord::RecordNotFound.new # Or, do something else
  end
end

这会产生与上面相同的结果......只是更多的代码。