динамический вызов методов внутри контроллера - PullRequest
2 голосов
/ 21 августа 2010

У меня есть следующий сценарий

Я хочу динамически добавлять методы в контроллер. Все мои имена методов находятся в таблице. Пожалуйста, обратитесь к следующему примеру

-table (method_names)-

1 - Walk
2 - Speek
3 - Run

а у меня контроллер

class UsersController < ApplicationController

   def index

   end 

end

Внутри этого действия индекса я хочу динамически вызывать свои методы. Эти методы были реализованы в другом виде.

У меня есть другой контроллер, такой как

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  

** Я сделал что-то вроде ниже и работает

class UsersController < ApplicationController

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

end

Но мой вопрос: это правильный путь или есть какой-то другой способ сделать это

Заранее спасибо

ура

Самера

Ответы [ 2 ]

5 голосов
/ 22 августа 2010

Пока работает первый ответ, я бы предпочел что-то вроде этого

module ImplementsActions
  def run
    ...
  end

  def walk
    ..
  end

  def ...
end

и затем в вашем контроллере напишите

class UsersController < ActionController::Base

  include ImplementsActions

  # now you can just use run/speek/walk

  def index
    run
  end
end

Значительно чище, потому что код может быть общим, но он определен там, где он вам нужен.

1 голос
/ 21 августа 2010

Я думаю, что лучше всего избегать использования eval.Если вы можете, я бы сделал все ваши методы класса методы и затем запустить их так:

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