【问题标题】:Passing a splat and hash to a method?将 splat 和哈希传递给方法?
【发布时间】:2012-08-25 09:39:55
【问题描述】:

解决方案

在 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

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

【问题讨论】:

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


    【解决方案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 的最后一个成员是否为哈希:如果是,则为您的选项,如果不是,则为空。

    【讨论】:

    • 遗憾的是,我们正在运行 REE 1.8.7,所以这是不行的 :(
    • 不幸。然后我认为我最后抛出的解决方案是你最好的选择——检查 splat 数组的最后一个成员是否是哈希,如果是,假设它是选项哈希。
    • 好吧,您给了我一个想法,即尝试仅修改源数组中的哈希而不是修改它。瞧! (我把我的解决方案放在我的答案中,所以我可以接受你的)。
    猜你喜欢
    • 2016-08-13
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2020-06-14
    • 2013-09-04
    相关资源
    最近更新 更多