在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中是否合法?典型的导轨方式是什么?

感谢您的任何建议......!

+1

为什么不把'create_product' “MyFabricatorClass”上的类方法? – jvillian

+0

@jvillian:感谢您的评论。对不起,我选择了错误的命名。 MyFabricatorClass不是重新召集我的班级,但第三方。所以,更改MyFabricatorClass不是一个选项。 – schmitze333

在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