ruby-on-rails – Rails:为什么我在控制器方法中访问此成员变量
我看到一个简单的控制器方法的一个非常奇怪的问题.要么我缺少一些基本的东西,要么我遇到了一个bug.我的赌注是前者.
我有一个带ThingController的Thing模型. Thing有两个变量,名称和显示,两个字符串. ThingController(下面的代码)有一个方法toggle_display,它可以在“on”和“off”之间切换显示内容. 问题是,当我调用此动作时,Rails会找到正确的Thing,但@ thing.display为nil.当我检查数据库时,’display’列中的值是正确的. 奇怪的是,当我在下面的代码中取消注释第三行时(即在访问@ thing.display之前访问@ thing.name)然后@ thing.display很好 – 它不是nil并且它具有我期望的值.就好像@ thing.display只在我访问@ thing.name后才能正确初始化. 知道为什么我会看到这种非常奇怪的行为吗? def toggle_display @thing = Thing.find(params[:id]) # @thing.name if @thing.display @thing.toggle_display_in_model @thing.save end redirect_to things_url end 解决方法
问题是在内核中已经有一个名为“display”的方法与ActiveRecord的魔法相冲突.
ActiveRecord定义method_missing中与数据库字段对应的方法.因此,在调用method_missing之前,这些方法实际上并不存在.当你在@thing上调用name时,会调用method_missing,因为没有name方法.但是,当您调用display(之前没有调用另一个不存在的方法)时,不会调用method_missing,因为已在Kernel中定义了display并执行了此定义.因为Kernel的显示方法返回nil,所以你得到nil. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |