-1

次のように、可変数の引数を取るアクションメソッドがあります。

action!(:message => message, :photo => photo, :status => status)

引数が含まれている場合、それは(特定の基準に基づいて)有効である必要があるため、次のようなものは機能しません。

action!(:message => nil, :photo => nil, :status => nil)

これを念頭に置いて、引数が有効な場合にのみ引数を含めることができるようにしたいと思います。素朴に私は私がこのようにそれを行うことができることを知っています:

 if message.valid? && photo.valid? && status.valid?
     action!(:message => message, :photo => photo, :status => status)
 elsif message.valid? && photo.valid?
     action!(:message => message, :photo => photo)
 ...
 end

これは機能しますが、本当に醜く非効率的です。この呼び出しに適切な引数のセットを作成するためのより良い方法はありますか?

4

3 に答える 3

3

引数は単なるハッシュなので、ハッシュオブジェクトを作成して必要なものを追加してみませんか。

args = {}
args[:message] = message if condition
args[:photo] = photo if condition
...

action!(args)
于 2013-01-30T02:27:39.447 に答える
0

なぜあなたはあなたの方法の中でそれらを検証しないのaction!ですか?そして、trueまたはfalseを返し、すべてのレコードが有効かどうかを現在のアクションに通知します。

  if action!(:message=>message .......)
     //do something
  else
     //other things
  end
于 2013-01-30T02:20:15.983 に答える
0

メタプログラミングを使用できます。

arguments = [:message, :photo, :status].inject({}) do |result, argument|
  object = __send__ argument
  result[argument] = object if object
  result
end

action! argument

、およびがローカル変数(メソッドではない)の場合、代わりに使用する必要がmessageありますphotostatus#eval#__send__

于 2013-01-30T02:36:40.627 に答える