Ruby on rails 如何将哈希添加到*args?

Ruby on rails 如何将哈希添加到*args?,ruby-on-rails,ruby,Ruby On Rails,Ruby,如何有条件地向Rails中的*args数组添加哈希?如果原始值存在,我不想践踏它 例如,我有一个接收数组的方法: def foo(*args) # I want to insert {style: 'bar'} into args but only if !style.present? bar(*args) # do some other stuff end 我已经开始使用rails提供的extract\u选项和reverse

如何有条件地向Rails中的
*args
数组添加哈希?如果原始值存在,我不想践踏它

例如,我有一个接收数组的方法:

def foo(*args)
  # I want to insert {style: 'bar'} into args but only if !style.present?
  bar(*args)                              # do some other stuff 
end
我已经开始使用rails提供的extract\u选项和reverse\u merge方法:

def foo(*args)
  options = args.extract_options!         # remove the option hashes
  options.reverse_merge!  {style: 'bar'}  # modify them
  args << options                         # put them back into the array
  bar(*args)                              # do some other stuff 
end
def foo(*args)
选项=args.extract_options!#删除选项散列
选项。反向合并!{style:'bar'}#修改它们

args是,
提取选项
是在Rails中实现这一点的方法。如果你想变得更优雅,你必须给它取个别名,或者找到你自己的方法来处理这个需求,或者由已经做过的人来搜索gem。

派对有点晚了-但是如果你需要定期做这件事,就值得为此使用一个小的实用方法-例如,如下所示,它将
选项
-散列合并到
args
-ari-中,并负责将其与可能存在的散列args合并,或者在
args
中没有散列的情况下将其作为新散列追加:

def merge_into_args!(opts={}, *args)
  opts.each do |key, val|
    if args.any?{|a| a.is_a?(Hash)}
      args.each{|a| a.merge!(key => val) if a.is_a?(Hash)}
    else
      args << {key => val}
    end
  end

  args
end
还有一些例子:

# args without hash 
args = ["first", "second"]

# merge appends hash
args = merge_into_args!({ foo: "bar", uk: "zok" },*args)
#=> ["first", "second", {:foo=>"bar", :uk=>"zok"}]

# Another merge appends the new options to the already existing hash:   
args = merge_into_args!({ ramba: "zamba", halli: "galli" },*args)
#=> ["first", "second", {:foo=>"bar", :uk=>"zok", :ramba=>"zamba", :halli=>"galli"}]

# Existing options are updated accordingly when the provided hash contains
# identical keys:
args = merge_into_args!({ foo: "baz", uk: "ZOK!", ramba: "ZAMBA" },*args)
#=> ["first", "second", {:foo=>"baz", :uk=>"ZOK!", :ramba=>"ZAMBA", :halli=>"galli"}]

是否有需要将其放回
args
列表的原因?我相信前两个在Rails源代码中很常见。好问题。是的,函数
foo
将参数传递给另一个函数。我将对问题进行编辑以显示这一点。我正在写一个FormBuilder类,很多帮助者打电话给其他帮助者。谢谢你,我感谢你的反馈。
# args without hash 
args = ["first", "second"]

# merge appends hash
args = merge_into_args!({ foo: "bar", uk: "zok" },*args)
#=> ["first", "second", {:foo=>"bar", :uk=>"zok"}]

# Another merge appends the new options to the already existing hash:   
args = merge_into_args!({ ramba: "zamba", halli: "galli" },*args)
#=> ["first", "second", {:foo=>"bar", :uk=>"zok", :ramba=>"zamba", :halli=>"galli"}]

# Existing options are updated accordingly when the provided hash contains
# identical keys:
args = merge_into_args!({ foo: "baz", uk: "ZOK!", ramba: "ZAMBA" },*args)
#=> ["first", "second", {:foo=>"baz", :uk=>"ZOK!", :ramba=>"ZAMBA", :halli=>"galli"}]