将splat和hash传递给方法



解决方案

在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版本正确传递内容,因为这个映射可能会作为Rails3.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

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

实际上,如果您使用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的最后一个成员是否是哈希:如果是,那是你的选项,如果不是,你的选项是空的。

相关内容

  • 没有找到相关文章

最新更新