2010-08-20 7 views
2

J'ai le scénario suivantappel dynamique des méthodes à l'intérieur d'un contrôleur

Je souhaite ajouter dynamiquement des méthodes à un contrôleur. Tous mes noms de méthodes sont dans une table. S'il vous plaît se référer à l'exemple suivant

-table (method_names)- 

1 - Walk 
2 - Speek 
3 - Run 

et j'ai un contrôleur

class UsersController < ApplicationController 

    def index 

    end 

end 

Dans cette action index je veux appeler mes méthodes dynamiquement. Ces méthodes ont été implémentées ailleurs.

J'ai un autre contrôleur comme

class ActionImplementController < ApplicationController 

    def walk 
    puts "I'm walking" 
    end 

    def speek 
    puts "I'm sppeking" 
    end 

    def run 
    puts "I'm running" 
    end 


end 

** Je l'ai fait quelque chose comme ci-dessous et son est ce la bonne voie ou est-il anyother moyen de travail

class UsersController < ApplicationController 

    def index 
    a = eval("ActionImplementController.new.run") 
    end 

end 

Mais ma question est, à Pour ce faire,

Merci à l'avance

acclamations

sameera

Répondre

1

Je pense qu'il est généralement préférable d'éviter l'utilisation d'eval. Si vous pouvez, je ferais toutes vos méthodes les méthodes de classe, puis les exécuter comme ceci:

def index 
    ActionImplementController.send :run 
    # ActionImplementController.new.send(:run) works if you can't use class methods 
end 
+0

salut cam merci pour la réponse rapide - pourriez-vous expliquer comment s'il vous plaît passer des paramètres au-dessus: méthode run sameera – sameera207

+0

simplement les ajouter à l'appel d'envoi: 'Foo.send: méthode, arg1, arg2, ..., argN'. Voir aussi http://ruby-doc.org/core/classes/Object.html#M000332 – cam

+0

cam Salut, Works, merci beaucoup acclamations sameera – sameera207

5

Alors que la première réponse fonctionne, je préférerais quelque chose comme ça

module ImplementsActions 
    def run 
    ... 
    end 

    def walk 
    .. 
    end 

    def ... 
end 

puis dans votre contrôleur écriture

class UsersController < ActionController::Base 

    include ImplementsActions 

    # now you can just use run/speek/walk 

    def index 
    run 
    end 
end 

Beaucoup plus propre car le code peut être partagé, mais il est défini là où vous en avez besoin.