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#edit
和 undefined 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
这会产生与上面相同的结果......只是更多的代码。
我的 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#edit
和 undefined 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
这会产生与上面相同的结果......只是更多的代码。