1

解决方案

在 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, options,因为 link_tag 方法需要几个参数,而不是数组。如果它接收到一个数组,那么您将获得如下路径:css/reset/css/main.css

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

4

1 回答 1

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 的最后一个成员是否是散列:如果是,那是您的选项,如果不是,则您的选项为空。

于 2012-08-30T16:02:41.323 回答