を呼び出す:私はそれらを呼び出すコントローラで動的な方法私は2つのメソッドを持つクラスを持っている。例えば、引数
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]
リターン理由。 最も簡単な解決策は以下のとおりです。
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
それがnullかどう引数を渡さないために任意のより良い回避策があるかどうか、私は疑問に思います。
私はセキュリティについて考えていましたが、私は 'eval'の場合は分かりませんでした。 'update'、' destroy'などのメソッドを渡すことは、私にはあまり大したことではありませんでした。なぜなら、それはユーザーがやりたいものの1つだったからです。 私には1つの質問があります。なぜあなたはallowed_methodsでハッシュをフリーズしませんか? – Gregy
私は私の答えで最初に書いたものと似たようなものを使うことをお勧めします。より安全で、メソッドごとにパラメータの数を扱います。 – Geoffroy
'allowed_methods'は間違いなく良い考えですが、実装はover-over-designの完全な例です。 '%i | method_one method_two |'で十分です。同じ量のパラメータを持ち歩くことを使うトリックは、非常に悪い考えです.SRPの原則が破られ、基本的にこのコードがサポートされなくなります。 – mudasobwa