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

时间:2016-04-20 22:42:09

标签: ruby-on-rails ruby ruby-on-rails-4 simple-form

我的 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

当我创建新订单时,表单完全正常,所以不确定为什么我突然收到错误,有人可以帮我解决这个问题吗?

1 个答案:

答案 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

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