Ruby on Rails模型添加实例方法失败,报undefined method `zzz'错误
问题原因与解决方案
嗨,你遇到的这个错误核心原因是混淆了类方法和实例方法的定义与调用方式!
问题分析
你在Server模型里定义的是类方法:
# app/models/server.rb class Server < ActiveRecord::Base def self.zzz() # 带self的是类方法,属于整个Server类 end end
类方法只能通过类本身去调用,比如Server.zzz();而你在控制器里是用Server的实例@server(也就是Server.new创建出来的对象)去调用zzz,这自然会报错——因为实例对象上根本没有这个方法呀!
解决方法
根据你的需求,有两种修正方式:
1. 把类方法改成实例方法(如果你的逻辑是针对单个Server实例的)
只需要去掉方法定义前的self:
# app/models/server.rb class Server < ActiveRecord::Base def zzz() # 不带self,是实例方法,属于每个Server实例 # 这里写针对单个实例的逻辑 end end
这样控制器里的@server.zzz调用就完全没问题了。
2. 如果确实需要类方法,调整控制器的调用方式
如果zzz的逻辑是针对整个Server类的(比如批量操作、查询统计),那保持模型的类方法不变,控制器里改成类调用:
class ServersController < ApplicationController def new @server = Server.new Server.zzz # 用类本身调用类方法 end end
小补充(Rails 4.2适用)
在Rails里,类方法常用在比如def self.find_active这类查询场景,而实例方法更多用来处理单个对象的行为,比如def full_name拼接实例的属性。根据你的业务逻辑选对应的方法类型就好~
内容的提问来源于stack exchange,提问作者rlandster
相关产品推荐
相关产品推荐

