在Rails中动态地包含/排除参数

时间:2013-01-30 01:57:14

标签: ruby-on-rails ruby methods

我有一个采用可变数量参数的动作方法,如下所示:

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

虽然这很有效但却很低效。是否有更好的方法为此调用构建正确的参数集?

3 个答案:

答案 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

如果messagephotostatus是局部变量(但不是方法),则应使用#eval代替#__send__