NoMethodError,ActiveRecord 4.0

时间:2016-08-19 18:18:32

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord rails-activerecord

我正在尝试删除,而不是销毁(这也不起作用),作为Rails学习练习的记录。

在rails控制台中,我执行:subject.pages.delete(second_page)并收到以下错误消息(尝试销毁时也是如此)。

  

NoMethodError:nil的未定义方法`name':NilClass

在subject.pages中是:

=> #<ActiveRecord::Associations::CollectionProxy [#<Page id: 2, subject_id: 1, name: "First Page", permalink: "first", position: 1, visible: false, created_at: "2016-08-19 17:58:02", updated_at: "2016-08-19 17:58:02">, #<Page id: 3, subject_id: 1, name: "Second Page", permalink: "second", position: 2, visible: false, created_at: "2016-08-19 17:59:07", updated_at: "2016-08-19 17:59:07">]>

主题与页面具有一对多的关系。 Page belongs_to subject。

Ed1:看起来'second_page'是一个局部变量。所以当我退出Rails控制台时。我无法重新创建问题,但我仍然无法删除此记录。

Ed2:所以,我决定继续学习,直到我使用ERB调用subject.pages.size之前我没有遇到任何打嗝。再次,我得到了一个'NoMethodError',其中html.erb文件无法呈现。我应该在哪里检查以确保我正确地声明页面?我仔细检查了老师的代码,它看起来都一样(我可能会遗漏一些小问题),但我在如何在我的应用程序中修复此错误时迷失了方法。

Ed3(最后):我删除了创建的表并重新开始。我不确定解决方案究竟是什么,但我认为改变控制器中的关系确实有帮助。谢谢你的帮助。

使用:Rails 4.0.0,ActiveRecord 4.0.0,MySQL 5.17.14(如果需要更多信息,我会及时更新)

3 个答案:

答案 0 :(得分:1)

根据delete(*records)的{​​{3}}

  

对于has_many关联,删除是根据:dependent选项指定的策略完成的。[...]   如果没有:依赖选项,那么它将遵循默认策略。默认策略是:nullify。这会将外键设置为NULL。

这意味着记录不会被破坏,只会被破坏。 您必须将相关选项设置为:destroy以从数据库中删除记录。

class Subject < ActiveRecord::Base
  has_many :pages, dependent: :destroy
end

答案 1 :(得分:0)

您正在使用has_many关联的依赖删除(销毁)选项,这是无法完成的。此选项仅适用于belongs_to关联。

我希望我能帮你清楚一点!

答案 2 :(得分:0)

回答删除记录的初始问题。

我无法使用subject.pages.delete(second_page)删除此记录,但我可以使用Page.find(3).delete将其删除。

回答有关NoMethodError的问题。

This评论是发现此问题最具洞察力的。也就是说,由于我使用的是Rails 4.0.0,因此会出现问题和错误。一个常见问题是NoMethodError。我通过更新我的Gemfile然后在我的应用程序的根目录中bundle install升级到4.1.2。然后我重新启动了Rails服务器,我没有任何问题。 subject.pages.size能够呈现。