2011-11-11 5 views
2

私はこれらの奇妙な "これはうまくいきました。Rails Routing:周囲の静的セグメントからトークンを分離する方法

私のルートで

が、私はそうフォーマットq/java-questions/performanceのURLはこれが動作するために使用params[:topic] = javaparams[:tag] = performance

searchアクションへのルートだろうが、今私が見つからないルートを取得

controller :questions do 
     match 'q/:topic-questions/:tag' => :search 
    end 

を持つファイルエラー。私は

match 'q/(:topic)-questions/:tag' => :search 

に切り替える場合は、再度ルートを見つけたが、私はtopicはオプションのパラメータになりたくありません。これは、:topic-questionsをトークンに分離して静的な文字列に分離することが困難であることを意味すると思います。トークンをきれいに分離する別の方法がある場合は、それ以外の場合は()に入れますか?

注 - トピックがオプションのパラメータにできない理由は、アクションキャッシュを実行するときに、オプションのパラメータがキャッシュキーに含まれないことです。

答えて

1

あなたのキャッシュの問題に応じて、単に「-questions」の部分をオプションに:

controller :questions do 
    match 'q/:topic(-questions)/:tag' => :search 
end 

このキャッシュキーは常に話題の「Java」

編集に区別されq/java-questions/performanceq/java/performanceにマッチします

これは(彼は仕事の99%をしました)@sorensポストの変形例である:

controller :questions do 
    match 'q/:topic-:modifier/:tag' => :search, :defaults => {:modifier => 'questions'}, :as => :question_topic_tag 
end 

今、あなたのヘルパーは、Liを探しますKE:あなたは三つのパラメータ

params[:topic] 
params[:modifier] 
params[:tag] 

を持っているでしょうし、あなたがparams[:modifier] 1を無視することができ

controller :questions do 
    match 'q/:topic-:modifier/:tag' => :search 
end 

question_topic_tag_path('java', 'performance')は何についてのあなたのq/java-questions/performance

+0

ああ、これは本当に私に希望を与えた。しかし、ああ、ルートが生成されると、 'q/java-questions/performance'の代わりに' q/java/performance'が生成されます。 – cailinanne

+0

あまりにも速くあきらめないでください、編集を参照してください – sled

+0

それは、ありがとう! – cailinanne

1

これを強制的に正規表現にして、空でないものにすることができます。

match 'q/(:topic)-questions/:tag' => :search, :topic => /[A-Za-z]*/ # Or whatever. 

詳細については、ルーティングドキュメントのSegment Constraintsセクションを参照してください。

+0

チップをありがとう。残念ながら、私がtiをオプションにしたくない理由は、アクションキャッシングによるものです。私は、パラメータがオプションの場合、それはキャッシュキーに含まれていないことに気づいた。ですから、topicがオプションであれば、/ q/java-questions/performanceと/ q/php-questions/performanceの同一キャッシュキーを使います。 – cailinanne

+0

@cailinanne曖昧ではないルートを作成し、エンジン、通常のサーバー書き換えメソッド(サーバーに依存します)、またはRails自体の内部で、実際のルートをリダイレクト/レンダリングすることはできますが、また、q /:topic/questions /:タグのように、多少RESTfulな別のURLフォーマットで標準化することもできます。 –

+0

なぜあなたは( - 質問)をオプションにしませんか? – sled

2

私はDave NewtonにURL構造を再因子化しようとしていることに同意しますが、ルートを通じて "質問"を許可し、コントローラーのparams [:topic] URL

controller :posts do 
    match 'q/:topic/:tag' => :index, :topic => /.+-questions/ 
end 

で「-questions」の前に何かの存在を検証次に、あなたのコントローラにあなたが

topic = params[:topic].gsub!(/-questions/, "") 

これは少し匂いのようなものが必要になります。)

+0

うん、臭い、面白い、だから+1: –

2

を与えます。

+0

もちろん、私はそれを印刷物で見ることができます。もし/:a-:b /が経路で可能ならば... – sorens

0
match 'q/:topic:fix_it/:tag' => :search, :fix_it => /-questions/ 
関連する問題