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

元の質問

このマップはRails3.1.xのエンジンとしてロードされる可能性があるため、Railsのバージョンに応じて適切に渡すために変更されたstylesheet_link_tagヘルパーに取り組んでいます。これまでの私のコードと、やりたいことは次のとおりです。

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変数で*を呼び出すときに2番目のパラメーターを渡すことができないことです。sources, optionslink_tagメソッドには配列ではなく複数のパラメーターが必要なため、どちらも渡すことはできません。配列を受け取った場合、次のようなパスを取得します。css/reset/css/main.css

これを機能させる方法については、誰でもアイデアがあります。最悪のシナリオでは、オプションを渡すことはできませんが、それは避けたいと思います。

4

1 に答える 1

1

実際、Ruby 1.9 を使用している場合は、他のパラメーターの前にスプラットを使用できます。そのようです:

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 に答える