2016-12-15 4 views
2

私は/thingers/widgetsルートの名前を変更しています。すべてwidget関連のURLをthingerの対応する1行にリダイレクトすることができます。動作しませんワイルドカード照合でリダイレクト

get '/widgets(*anything)', to: redirect('/thinger%{anything}'), 
    as: 'widgets_redirect' 

^^^:それは%2F30%2Fとして通じスラッシュ渡し、ですべてのファイル拡張子を通らないような

何か。私が持っている

ザ・唯一の作業溶液は、いくつかの行にあります。

get '/widgets', to: redirect('/thingers'), as 'widgets_redirect' 
get '/widgets/:id', to: redirect('/thingers/%{id}') 
get '/widgets/:id/:action.:ext', to: redirect('/thingers/%{id}/%{action}.%{ext}') 
get '/widgets/:id/:action', to: redirect('/thingers/%{id}/%{action}') 

*編集:スワップ最後の2行は、ファイルの拡張子が一致せずにそれ以外の場合は1と間違って拡張子を持つ要求を処理します。

これらのケースをすべて1行でカバーするにはどうすればよいですか?

答えて

2

。文字はActionController :: Routing :: SEPARATORSで定義されています。これはURLを分割する特殊文字をリストしています。このため、すべての内線が切断されています。

あなたは.SのURLを分割避けたい場合は、あなたが渡す必要があります:あなたが持つすべてのリンクをリダイレクトするために、これを試すことができ、引数

を:制約=> {yourvalue => /正規表現/}同様の拡張子:

これら二つの経路は、あなたが達成しようとしている何を与える:

get '/widget', to: redirect('/thingers') 
get 'widget/:thingy', to: redirect('/thingers/%{thingy}'), :constraints => { :thingy => /.*/ } 
+0

はなぜ '' /.*/もスラッシュが含まれていますか? – tuff

+0

です。あなたが今ex: '/ widget/something/another.txt'のために書くリンクは、'/thingers/something/another.txt'にリダイレクトされます。 –

+0

残念ながら、スラッシュは通過せずにURLエンコードされていますので、 '/ widgets/info.json'では'/thingers30%2Finfo.json'にリダイレクトされます。スラッシュをマッチさせることができれば、あなたのソリューションが2行必要な理由を知りたいのですが、 'redirect( '/ thingers%{thingy}')だけではないのですか? – tuff

関連する問題