我的 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
当我创建新订单时,表单完全正常,所以不确定为什么我突然收到错误,有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
当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
这将产生与上面相同的结果......只需更多代码。