我想定义类变量test
,threshold
这样我就可以在我的Rails应用中使用Order.test, Order.threshold
但是在使用rails控制台
时我无法访问类变量我必须误解一些问题,问题出在哪里?感谢。
class Order < ActiveRecord::Base
@@test=123
@@threshold = {
VIP: 500,
PLATINUM: 20000
}
以下是rails console
irb(main):001:0> Order.class_variables
=> [:@@test, :@@threshold]
irb(main):002:0> Order.test
NoMethodError: private method `test' called for #<Class:0x007fe5a63ac738>
答案 0 :(得分:12)
这样做:
class Order < ActiveRecord::Base
cattr_reader :test, :threshold
self.test = 123
self.threshold = {
VIP: 500,
PLATINUM: 20000
}
end
Order.test
或者我使用常数:
class Order < ActiveRecord::Base
TEST = 123
end
Order::TEST
答案 1 :(得分:4)
我只想使用类方法:
class Order < ActiveRecord::Base
def self.test
123
end
def self.threshold
{ VIP: 500, PLATINUM: 20000 }
end
end
常量也可以使用,但是如果您已经拥有需要Order.test
和Order.threshold
的代码,那么您必须更改代码以调用常量。另外,Avdi Grimm给出了使用方法而不是常量in a blog post的一些很好的理由。
访问类变量的原因不会像你期望的那样工作,因为Ruby限制了对这样的变量的访问。您需要直接定义访问者方法(如self.test
或self.threshold
),或间接使用cattr_reader
之类的内容。如果您需要从外部世界写入变量,也可以使用cattr_accessor
。
我通常建议避免使用类变量。他们有一些unintuitive behavior。