我正在尝试删除,而不是销毁(这也不起作用),作为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(如果需要更多信息,我会及时更新)
答案 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能够呈现。