我有以下情况
我想动态地向控制器添加方法。我的所有方法名都在一个表中。请参考以下示例
-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
答案 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