我有一个采用可变数量参数的动作方法,如下所示:
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
虽然这很有效但却很低效。是否有更好的方法为此调用构建正确的参数集?
答案 0 :(得分:3)
参数只是一个哈希,所以为什么不创建一个哈希对象并添加你需要的东西:
args = {}
args[:message] = message if condition
args[:photo] = photo if condition
...
action!(args)
答案 1 :(得分:0)
为什么不在action!
方法中验证它们?并返回true或false以告知当前操作是否所有记录都有效。
if action!(:message=>message .......)
//do something
else
//other things
end
答案 2 :(得分:0)
您可以使用元编程:
arguments = [:message, :photo, :status].inject({}) do |result, argument|
object = __send__ argument
result[argument] = object if object
result
end
action! argument
如果message
,photo
和status
是局部变量(但不是方法),则应使用#eval
代替#__send__