Ruby on Railsは:場所のツリー階層のルーティング
-
11-09-2019 - |
質問
だから我々は「ヨーロッパ/フランス/パリ」のようなIDを持つ場所を追跡するレガシーシステムを持っている、と私は、HTTPのようなURLにこれを有効にするRailsのファサードを構築しています:// foobarに/場所/ヨーロッパ/フランス/パリ。この要件は、無制限で可能なレベルの数交渉ではない、と我々はスラッシュをエスケープすることはできません。
HTTPのためのroutes.rbを設定:// foobarに/場所/ヨーロッパにすることは簡単です。
map.resources :places
...しかします。http:// foobarに/場所/ヨーロッパ/フランスは "アクションなしはヨーロッパに応答しなかった" 文句を言います。私が試した:
map.connect '/places/:id', :controller => 'places', :action => 'show'
...どうやらとして、これは、同じ結果を与える:idは最初の「/」で終わります。どのように私はIDが「場所」の後に何も、すべてをカバーするのですか?
解決
完全なドキュメントのためのルーティングガイドを見てください。
http://guides.rubyonrails.org/routing.htmlする
具体的には、 "4.9ルートグロッビング"
しかし、私はあなたが本当にあなたのようなルートを宣言されて何をしたいか考えてます:
map.connect '/places/*id', :controller => 'places', :action => 'index'
タグのようなURLで呼び出さ
/places/foo/bar/1
Yields a params[:id] => ["foo", "bar", "1"]
あなたは簡単に(再)「/」あなたが望む完全な文字列を生成するために参加することができた「FOO / / 1バー」あなたはおそらく手動で先頭のスラッシュを再挿入する必要があります(。
それはあなたが軌道に乗る必要があります。
他のヒント
私はこれを考え出す少し上のコーディの答えを微調整します:
map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'
の代わりにmap.connectのmap.placeを使用することにより、Railsは正しく、我々が扱って、生成place_url
ているものを資源place_path
などのヘルパーを知っています。
さて、第二ラインのはずの仕事が、ので、ここで上記のバグのおかげで、XMLをデフォルト、手動でIDを分割し、フォーマットを設定しますplaces_controller.rbための回避策だしません。
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"