2017-09-15 5 views
1

J'ai une question concernant les meilleures pratiques en matière de rails. Dans mon projet rails J'ai le code suivant:Est-ce une bonne pratique d'utiliser des variables statiques dans le contrôleur de rails?

class MyController < ApplicationController 

    def some_method 
    @product = MyFabricatorClass.new.create_product 
    end 

    ... 
end 

MyFabricatorClass ne dépend pas d'un état et son comportement est constant. Je fais aussi beaucoup de choses en C++ et pour moi, il est assez inefficace de toujours instancier un nouvel objet MyFabricatorClass. Dans un projet C++ je propably utiliser quelque chose comme:

class MyController < ApplicationController 

    @@my_fabricator = nil 

    def some_method 
    @@my_fabricator ||= MyFabricatorClass.new 
    @product = @@my_fabricator.create_product 
    end 

    ... 
end 

Est-ce style aussi legit dans Rails? Quelle serait la façon typique des rails de le faire?

Merci pour tout conseil ...!

+1

Pourquoi ne pas 'create_product' une méthode de classe sur MyFabricatorClass? – jvillian

+0

@jvillian: Merci pour votre commentaire. Désolé, j'ai choisi un mauvais nom. MyFabricatorClass n'est pas realls ma classe mais une tierce partie. Donc, changer MyFabricatorClass n'est pas une option. – schmitze333

Répondre

3

Il est préférable de ne pas utiliser les variables de classe (celles commençant par @@) dans ruby; see here why

Cela pourrait ressembler à un code bizarre, mais c'est la façon plus conventionnelle:

Vous définissez une variable d'instance « de classe », au lieu de définir une « variable de classe ».

class MyController < ApplicationController 
    @my_fabricator = nil 

    class << self 
    def some_method 
     @my_fabricator ||= MyFabricatorClass.new 
     @product = @my_fabricator.create_product 
    end 
    end 
end 

A propos class << self, voir here

Le code ci-dessus est la même chose que:

class MyController < ApplicationController 
    @my_fabricator = nil 

    def self.some_method 
    @my_fabricator ||= MyFabricatorClass.new 
    @product = @my_fabricator.create_product 
    end 
end 

Maintenant, vous pouvez juste faire:

MyController.some_method 
+0

Merci pour la clarification et les ressources supplémentaires. Accepté et mis à jour – schmitze333