1

このルートがある場合 (routes.rb 内):

match 'posts', :to => 'posts#index'

次のルートが表示され、一致します。

# Case 1: non nested hash params
posts_path(:search => 'the', :category => 'old-school')
#=> "/posts?search=the&category=old-school"

# Case 2: nested hash params
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts?filter[search]=the&filter[category]=old-school"

カテゴリ パラメータをメイン URL の一部にしたい場合は、Case 1でこれを行うことができます。

match 'posts(/:category)', :to => 'posts#index'

次のルートが表示され、一致します。

# Case 1: non nested hash params
posts_path(:search => 'the', :category => 'old-school')
#=> "/posts/old-school?search=the"

しかし、param がネストされている場合 (ケース 2 ) 、どうすれば同じことができますか?

次のルート定義を期待します。

match 'posts(/:filter[category])', :to => 'posts#index'

このように動作するには:

# Case 2: nested hash params
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts/old-school?filter[search]=the"

しかし、うまくいきません。

この同じ質問が 2 つの場所で見つかりましたが、正しい答えはありません。

Rails ガイドでは、これについて何も指定していません。

これはレールではできないと思いますか?本当?

4

1 に答える 1

0

代わりに2つの異なるルートを作成できます

match 'posts', :to => 'posts#index'
match 'posts/:category', :to => 'posts#index'

次のルートは、意図したとおりには機能しません。

match 'posts(:filter[category])', :to => 'posts#index'

:filter は、url ヘルパーに渡される最初の引数、または渡される has のキー :filter の値の単なるプレースホルダーです。ルート文字列内の式は評価されません。

あなたの質問への答えは、レールではこれを行うことができないということだと思います。ただし、これを別の方法で行うことをお勧めします。Rails では、慣習に従い、作業を簡単にすることが非常に役立ちます。

ここで 3 つのことを行っているようです。基地局ルート

match 'posts', :to => 'posts#index'

カテゴリがネストされているルート。ユーザーにより良い URL を提供する可能性が最も高い

match 'posts/:category', :to => 'posts#index'

そして、最初のものと同じ検索 URL、またはアクションをよりクリーンにするための別の検索 URL

match 'posts/search', :to => 'posts#search'

あなたが提案している方法でルートを複雑にすることを考えることができる理由は本当にありません. とにかく検索クエリの URL は見栄えがよくないので、なぜわざわざ検索用に 2 つの URL を処理する必要があるのでしょうか。1つだけで済みます。

あなたは間違いなくランニングを見てください

rake routes

これにより、ルートファイルで定義した内容が正確にわかります。また、ルーティング テストを設定して、カスタム ルートが正しく実行されていることを確認することもできます。

あなたの例は機能しません(あなたが示したように)

# Case 2: nested hash params 
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts/old-school?filter[search]=the"

しかし、あなたが探しているのはこれです

posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts?filter[search]=the&filter[category]=old-school"

このようにすればOKです。

posts/:category を保持したい場合は、これをナビゲーションのみに使用し、検索には使用しないでください。

それが役立つことを願っています

于 2012-01-18T05:42:24.863 に答える