【问题标题】:Rails undefined method 'model_name' for nil:nilClass with nested attributes带有嵌套属性的 nil:nilClass 的 Rails 未定义方法“model_name”
【发布时间】:2016-04-20 22:42:08
【问题描述】:

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

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

【问题讨论】:

  • find_by_id 更改为 find ... 可能是错误的,但我的猜测是该行不存在;如果是这样,find 会爆炸(正确地,因为无论如何您都不想在这种情况下继续); find_by_id 只会将事物设置为 nil,这会在途中的某个地方不确定地爆炸。
  • 这绝对有效,请在下面回答,以便我将其标记为解决方案!非常感谢!顺便说一句,find_by_id 有没有办法“炸毁”,所以我可以得到同样的错误? @GoGoCarl
  • 谢谢。有关第二个问题的详细信息,请参见下文。 find_by_id 永远不会爆炸,如果找不到记录,它总是会返回 nil。但是你可以手动处理这种情况。

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


【解决方案1】:

当 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

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

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2017-01-02
    • 2016-10-07
    相关资源
    最近更新 更多