我在我的一个模型中创建了一个相当简单的新方法。但是,当我进入rails控制台进行测试时,我收到以下错误:
NoMethodError: undefined method 'get' for #<Class:0x3a5032fc>
我保存了代码,关闭了rails控制台然后重新启动,但我仍然得到了NoMethod
class Race <ActiveRecord::Base
def get(race_date,track_name,race_number)
Race.where(:date =>race_date, :race_nbr => race_number, :track_id => (Track.where(:track_code => track_name)))
end
end
在控制台中,我输入以下内容:
Race.get("2011-12-04", "BEL", 1)
产生NoMethodError:undefined method 'get'
。
任何想法都会受到赞赏。
答案 0 :(得分:7)
您定义了Race类的实例方法。也许你会定义一个类方法,如:
def self.get(race_date, track_name, race_number)
track = Track.where(:track_code => track_name)
Race.where(:date => race_date, :race_nbr => race_number, :track_id => track)
end
然后您可以使用Race.get
。
答案 1 :(得分:4)
@luttette做对了;你需要创建一个类方法。下面是另一种可以定义类方法的方法。在您定义大量类方法的大型项目中,它可以是一种更简洁的组织代码方式,但这种观点纯粹是主观的。
class << self
def get(race_date,track_name,race_number)
Race.where(:date => race_date,
:race_nbr => race_number,
:track_id => (Track.where(:track_code => track_name)))
end
end
class << self
中定义的所有内容都成为一种类方法。
另一个选择是使用范围。
scope :get,
lambda { |race_date, track_name, race_number|
Race.where(:date => race_date,
:race_nbr => race_number,
:track_id => (Track.where(:track_code => track_name))) }
这个最后的解决方案作为范围看起来有点笨拙,所以在这种情况下最好使用类方法而不是范围。此外,我更喜欢具有描述性名称的范围,但我想这也适用于方法名称。
答案 2 :(得分:4)
在得到两个很好的答案之后,我觉得应该说出其他的东西:
如果您的控制台已经启动,则不会猜测您已添加了一些代码,因此您必须重新加载。
哟这样做,只需输入:
reload!
控制台中的(=不需要CTRL-C)。