在控制器内动态调用方法

时间:2010-08-20 21:31:48

标签: ruby-on-rails ruby methods eval

我有以下情况

我想动态地向控制器添加方法。我的所有方法名都在一个表中。请参考以下示例

-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

但我的问题是,这是正确的方式,还是有其他方法可以做到这一点

提前致谢

欢呼声

sameera

2 个答案:

答案 0 :(得分:5)

虽然第一个答案有效,但我更喜欢这样的

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 :(得分:1)

我认为通常最好避免使用eval。如果可以的话,我会将所有方法都设为类方法,然后像这样运行它们:

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