我遇到了一个看似简单的问题,但我无法弄清问题是什么。我正在使用Rails 4构建API。
我有一个名为Constant
的模型class Constant < ActiveRecord::Base
def self.calcuate_something(a, b, c, d, e)
self.number_one + self.number_two + (self.number_three*a) + (self.number_four*b) + (self.number_five*c) + (self.number_six*d) + (self.number_seven*e)
end
end
此模型包含number_one
,number_two
,number_three
,number_four
,number_five
,number_six
和number_seven
属性。
在我的控制器中,我这样做:
@constant = Constant.find_by_id(params[:id])
number = @constant.calculate_something(1, 2, 3, 4, 5)
然后我收到一条错误NoMethodError (undefined method 'number_one' for #<Class:0x007fd3d4466068>):
。我没有尝试访问名为number_one
的方法,我试图在模型中找到该字段。
我已经验证了所有条目都有一个名为number_one
的列,并且每个条目都有一个值。我的语法或设置有问题吗?
提前致谢!
答案 0 :(得分:2)
问题在于您对self.calculate_something(a, b, c, d, e)
的定义。使用关键字self
实际上是创建一个类方法而不是实例方法,因此无法访问这些属性。
尝试将其重构为def calculate_something(a, b, c, d, e)
评论更新:
第二个问题是@constant
被分配给由Constant.find_by_id(params[:id])
而不是记录实例生成的ActiveRecord_Relation,因为rails在必要时不会自动评估查询。可以通过将find_by_id
更改为find
来解决此问题,或者强制查询按Constant.find_by_id(params[:id]).first
执行。就个人而言,我喜欢更改为find
,因为您知道您想要的特定记录。
答案 1 :(得分:1)
阅读Class and Instance Methods in Ruby,您想要将对象的方法定义为不带self.
的实例方法:
def calculate_something(a, b, c, d, e)
但是,如果要定义类方法,则需要使用self
。
请勿使用find_by_id
,您需要使用find
,如下所示:
@constant = Constant.find(params[:id])