在rails控制器中使用静态变量是否是一种好的做法?
问题描述:
我有一个关于rails最佳实践的问题。 在我的轨道项目中,我有以下代码:在rails控制器中使用静态变量是否是一种好的做法?
class MyController < ApplicationController
def some_method
@product = MyFabricatorClass.new.create_product
end
...
end
MyFabricatorClass不依赖某些国家,而且其行为是不变的。我也做了很多C++的东西,对我来说,总是实例化一个新的MyFabricatorClass对象会让人感觉不够高效。在C++项目中,我会使用类似的东西:
class MyController < ApplicationController
@@my_fabricator = nil
def some_method
@@my_fabricator ||= MyFabricatorClass.new
@product = @@my_fabricator.create_product
end
...
end
这种风格在Rails中是否合法?典型的导轨方式是什么?
感谢您的任何建议......!
答
在ruby中不使用类变量(以@@
开头的变量)是一种更好的做法; see here why
这可能看起来像一个奇怪的代码,但是这是比较传统的方式:
您可以设置一个“类”的实例变量,而不是设置一个“类变量”。
class MyController < ApplicationController
@my_fabricator = nil
class << self
def some_method
@my_fabricator ||= MyFabricatorClass.new
@product = @my_fabricator.create_product
end
end
end
关于class << self
,看到here
上面的代码是一样的为:
class MyController < ApplicationController
@my_fabricator = nil
def self.some_method
@my_fabricator ||= MyFabricatorClass.new
@product = @my_fabricator.create_product
end
end
现在,你可以这样做:
MyController.some_method
+0
感谢您澄清和额外的资源。接受和upvoted。 – schmitze333
为什么不把'create_product' “MyFabricatorClass”上的类方法? – jvillian
@jvillian:感谢您的评论。对不起,我选择了错误的命名。 MyFabricatorClass不是重新召集我的班级,但第三方。所以,更改MyFabricatorClass不是一个选项。 – schmitze333