加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails:为什么我在控制器方法中访问此成员变量

发布时间:2020-12-17 03:08:54 所属栏目:百科 来源:网络整理
导读:我看到一个简单的控制器方法的一个非常奇怪的问题.要么我缺少一些基本的东西,要么我遇到了一个bug.我的赌注是前者. 我有一个带ThingController的Thing模型. Thing有两个变量,名称和显示,两个字符串. ThingController(下面的代码)有一个方法toggle_display,它
我看到一个简单的控制器方法的一个非常奇怪的问题.要么我缺少一些基本的东西,要么我遇到了一个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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读