将splat和hash传递给方法?

时间:2012-08-30 15:41:37

标签: ruby-on-rails ruby-enterprise-edition

解决方案

在1.8版本中,我无法直接使用接受的答案,但它帮助我找到了以下内容:

def stylesheet_include(*sources)
  if /^3\.[1-2]/ =~ Rails.version && sources.last.is_a?(Hash)
    sources.last.delete :cache
  end
  stylesheet_link_tag *sources
end

原始问题

使用修改后的stylesheet_link_tag帮助程序根据rails版本正确传递内容,因为此映射可能在Rails 3.1.x中作为引擎加载。到目前为止,这是我的代码,以及我想做的事情:

def stylesheet_include(*sources)
  options = sources.extract_options!.stringify_keys
  if /^3\.[1-2]/ =~ Rails.version
    options.delete "cache"
  end
  stylesheet_link_tag *sources, options
end

问题是,当我在sources变量上调用*时,我无法传递第二个参数。我也不能只传递sources, options,因为link_tag方法需要几个参数,而不是数组。如果它收到一个数组,那么你得到的路径如下:css/reset/css/main.css

任何人都有关于如何让它发挥作用的想法。更糟糕的情况我不能将选项传递给它,但我宁愿避免这种情况。

1 个答案:

答案 0 :(得分:1)

实际上,如果你使用Ruby 1.9,你确实可以在其他参数之前有splats。像这样:

def stylesheet_include(*sources, options)
  options = sources.extract_options!.stringify_keys
  if /^3\.[1-2]/ =~ Rails.version
    options.delete "cache"
  end
  stylesheet_link_tag *sources, options
end

问题当然是,传递给此方法的最后一件事将始终变为options,即使它不是哈希值。并且您也不能将默认值分配给options,因为这种行为会非常模糊。因此,如果您始终确保至少将空哈希作为stylesheet_include的最后一个参数传递,则该解决方案将起作用。

如果这对您不起作用,请尝试将splat作为参数,并查看splat的最后一个成员是否为哈希:如果是,则为您的选项,如果不是,则选项为空。