【问题标题】:Dynamically including/excluding arguments in Rails在 Rails 中动态包含/排除参数
【发布时间】:2013-01-30 01:57:14
【问题描述】:

我有一个带有可变数量参数的操作方法,如下所示:

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

虽然这行得通,但它确实丑陋且效率低下。有没有更好的方法来为此调用构建正确的参数集?

【问题讨论】:

  • 它没有采用可变数量的参数。它只接受一个参数。
  • 知道了。我希望你能理解一个逗号分隔的列表如何看起来像一个菜鸟的多个参数。我正在学习。

标签: ruby-on-rails ruby methods


【解决方案1】:

参数只是一个散列,所以为什么不直接创建一个散列对象并添加你需要的东西:

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

action!(args)

【讨论】:

  • 刚刚尝试过,效果很好。我不知道你可以只传递一个哈希对象来代替它的单个键/值。
【解决方案2】:

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

  if action!(:message=>message .......)
     //do something
  else
     //other things
  end

【讨论】:

    【解决方案3】:

    您可以使用元编程:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      相关资源
      最近更新 更多