例如调用我有两个方法的类:动态方法与参数
class Example < ActiveRecord::Base
def method_one(value)
end
def method_two
end
end
和方法在控制,我打电话给他们:
def example
ex = Example.find(params[:id])
ex.send(params[:method], params[:value]) if ex.respond_to?(params[:method])
end
但问题是当我尝试调用method_two
ArgumentError (wrong number of arguments (1 for 0))
这是因为params[:value]
返回nil
。 最简单的解决方法是:
def example
ex = Example.find(params[:id])
if ex.respond_to?(params[:method])
if params[:value].present?
ex.send(params[:method], params[:value])
else
ex.send(params[:method])
end
end
end
我不知道是否有什么更好的解决方法,不传递参数,如果它是空。
我在那边想着安全问题,但我不知道'eval'的情况。像'update','destroy'等传递方法对我来说并不重要,因为这是我想允许用户做的事情之一。 我有一个问题。你为什么不用'allowed'方法冻结hash? – Gregy
我推荐使用类似于我在答案中第一次写的内容,它会更安全,并按照每种方法处理参数的数量。 – Geoffroy
'allowed_methods'绝对是一个好主意,但是这个实现是超设计的完美例子。 '%i | method_one method_two |'就够了。使用相同数量的参数的诀窍是一个非常糟糕的主意:它破坏了SRP原理并基本上使这些代码不可支持。 – mudasobwa