16

私はroutes.rbでそのように機能するリダイレクトを持っていました。

match "/invoices" => redirect("/dashboard")

これにクエリ文字列を追加して、たとえば、

/invoices?show=overdue

にリダイレクトされます

/dashboard?show=overdue

私はいくつかのことを試しました。私が持っている最も近いものは;

match "/invoices?:string" => redirect("/dashboard?%{string}")

これで正しい出力が得られますが、元のURLは引き続きブラウザに表示されます。

かなりシンプルなものが欠けていると思いますが、何がわかりません。

4

3 に答える 3

16

この場合、リクエストオブジェクトを使用できます。

match "/invoices" => redirect{ |p, request| "/dashboard?#{request.query_string}" }
于 2012-12-26T11:27:01.543 に答える
11

これを行う最も簡単な方法(少なくともRails 4では)は、リダイレクト呼び出しにオプションモードを使用することです。

get '/invoices' => redirect(path: '/dashboard')

これにより、パスコンポーネントのみが変更され、クエリパラメータはそのままになります。

于 2016-06-23T00:39:26.890 に答える
0

受け入れられた回答は完全に機能しますが、物事を乾燥状態に保つにはあまり適していません。複数のルートをリダイレクトする必要がある場合は、重複するコードがたくさんあります。

この場合、カスタムリダイレクタは洗練されたアプローチです。

class QueryRedirector
  def call(params, request)
    uri = URI.parse(request.original_url)
    if uri.query
      "#{@destination}?#{uri.query}"
    else
      @destination
    end
  end

  def initialize(destination)
    @destination = destination
  end
end

redirectこれで、このクラスの新しいインスタンスをメソッドに提供できます。

get "/invoices", to: redirect(QueryRedirector.new("/dashboard"))

より詳細な説明のある記事を書きました。

于 2019-03-01T10:02:14.463 に答える