2

を使用して次のように URL を書き換えようとしていますrack-rewrite

/group1/feedになります/feed、ヘッダー付き"GROUP_NAME" => "group1"

現在、私は次のことを可能にするラック書き換えのハッキングされたバージョンを使用しています:

use Rack::Rewrite do
  rewrite /\/([^\/]*)\/(.+)/, '/$2',
  headers: lambda { |base, route| { 'GROUP_NAME' => base } }
end

の在庫バージョンのブロックにはbase, route が提供されていないことに注意してください。headersrack-rewrite

私が探していることを達成するためのハックの少ない方法があるかどうか疑問に思っています。

4

1 に答える 1

0

ソースを見ると、どこに定義されていますかrewrite

def rewrite(*args)
  add_rule :rewrite, *args
end

引数のスプラットが必要であることがわかります。それをたどると、の定義が表示されますadd_rule

def add_rule(method, from, to, options = {}) #:nodoc:
  @rules << Rule.new(method.to_sym, from, to, options)
end

これらの分割された引数の 1 つは、Ruleインスタンスの構築に使用されるオプション ハッシュです。これらのオプションの 1 つが で:headers、これはという変数に追加されますadditional_headers。これは、一部のルールのヘッダーにマージされます

残念ながら、はマージされないrewrite数少ないルールの 1 つです。これは、現在のパブリック API がこれに役立たないため、質問に対する答えの一部が「いいえ」であることを意味します。個人的には、オプションをこのルールにマージしないという決定の理由がわかりません。もし私があなたなら、ライブラリをフォークして追加し、プル リクエストを送信してメイン ブランチに追加してもらいます。 . 待っている間も、次のことができます。

rewrite /\/([^\/]*)\/(.+)/, '/$2', :headers => {"GROUP_NAME" => $1}

あなた自身のフォークから。

于 2013-04-10T01:22:36.627 に答える