-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

您可以使用元编程:

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

action! argument

ifmessage和是局部变量(但不是方法) photostatus您应该使用#eval而不是#__send__

于 2013-01-30T02:36:40.627 回答
0

你为什么不在你的方法中验证它们action!?并返回 true 或 false 以告知当前操作是否所有记录都有效。

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