例如調用我有兩個方法的類:動態方法與參數
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