2017-12-11 10 views
0

Rails5 APIでは、経路にContraintsを追加することができました。例えば;ブドウにクエリパラメータの制約を適用するにはどうすればよいですか?

GET /hello => hello#index 
GET /hello?download => hello#download 

ご覧のとおり、両方のURLが同じです。違いは2番目に制約があり、ダウンロードパラメータがURLにある場合は別のアクションにリダイレクトされます。

グレープで同じことをどうすればできますか?私は彼らのドキュメントや問題のリストにリソースを見つけることができませんでした。

get :hello do 
    'I am a hello world page' 
end 

が、URLは私がこれを実行したいその後、事前に定義され、いくつかのクエリパラメータがある場合:

get :hello do { ?download } 
    'download a file (for example)' 
end 

は私がparamsと遊んだとrequiresのparamsを作成します。 まだ最初の人がリクエストを受け取ります。

これは私がルートのためにRailsのAPIで使用しているものである:

class DownloadConstraint 
    def matches?(request) 
    request.query_parameters.key?('download') 
    end 
end 

UPDATE:私はこれについて、より明確になりたい。私は両方のルートを一緒に使用したいと思います。私はparamsバッグが実行前にパラメータを要求するのに使用できることを知っています。私が達成しようとしているのは、GETパラメータに基づいてルートを設定したいということです。 Railsの高度なcontraintsを参照してください:それはreceievedた場合http://guides.rubyonrails.org/routing.html#advanced-constraints

答えて

0

は、オプションのパラメータを追加し、リダイレクト:

params do 
    optional :download 
end 

get :hello do 
    redirect '/' if params[:download] 
end 
+0

感謝を。しかし、これは動作していません。参照:これは必須です:ダウンロードするパラメータを指定してください。しかし、もし私がそのパラメタを書いていけないとすれば?私はそれらを別のアクションにリダイレクトしたい。私はパラメータに基づいてルートを実行したい。私はすでに、私の質問で規制のサンプルを出しています。私は ':hello' **と**と** ** ** ** ** **を個別に使用したいと思います。私がこれを使うと、URLにURLを入れないと、 "ダウンロード"が行方不明になります。こちらをご覧ください:http://guides.rubyonrails.org/routing.html#advanced-constraints – Pratha

+0

申し訳ありませんが、私はあなたの質問に誤解しました。私はオプションのパラメータとリダイレクトでそれを処理します。 – infused

+0

その大丈夫です。私は実際にHTTPリダイレクトをしたくありません。私はちょうど私たちがRailsのようにリクエストに直接応答したいと思います。私はブドウにこのオプションがあると確信していますが、私はどのように知りません。 Railsができれば、ブドウもできます(私は推測します)。あるいは、ユーザーのブラウザやリクエストをリダイレクトせずに、リクエストを別のメソッド/ルートに内部的にリダイレクトする方法があります。 – Pratha

関連する問題