2011-10-07 5 views
5

キャッチオールルートをRails 3に書き込もうとしていますが、いくつかの用語を予約したいと思います。私は、特にデビッド・バロウズの回答で、この記事に出す例を次のようだ:Dynamic routes with Rails 3Rails 3:キャッチオールルートを読みやすく、修正しやすくする

私が使用している構文は以下の通りです:

match '*path' => 'router#routing', :constraints => lambda{|req| (req.env["REQUEST_PATH"] =~ /(users|my-stuff)/).nil? } 

さて、その構文はうまく動作します - 場合ユーザーはパス内の「ユーザー」または「マイ・スタッフ」のページを訪問し、キャッチオールを通過して特定の場所に移動します。ユーザーが他のURLに移動すると、ルーティングロジックに移動します。

私の質問は、可読性の詳細です。何かに対して経路を一致させる方法はありますか?は正規表現よりですか?一致する用語の配列を提供する方法はありますか?また、全体のものとは対照的に、ルートの特定のセグメントに一致する方法はありますか?

もちろん、Railsには組み込みのルーティングがありますが、このプロジェクトでは、特定のルートではコントローラがURLに存在しないという要件があります。したがって、キャッチオールです。任意のヘルプここ

ため

おかげで以下の答えは1更新routesファイルです:

class RouteConstraint 
    RESERVED_ROUTES = ['users', 'my-stuff'] 

    def matches?(request) 
    !RESERVED_ROUTES.map {|r| request.path.include?(r)}.empty? 
    end 
end 

App::Application.routes.draw do 
    resources :categories 
    resources :sites 

    match '*path' => 'router#routing', :constraints => RouteConstraint.new 

    devise_for :users, :path_names =>{ :sign_in => 'login', :sign_out => 'logout', :registration => 'register' } 
    root :to => "router#routing" 
end 

答えて

6

あなたが制約を指定するためにクラスを使用することができます。

+0

これは近づいていますが、リストされた「隠れたルート」をバイパスするのではなく、ロジックがルーティングコントローラにそれらを供給しようとします。もし私が強打や空を取り除いたら? matchesメソッドを呼び出すと、ロジックは予約語のために機能しますが、他のすべてのものは機能しません。申し訳ありませんが、ラムダの私の把握はかなり限られています。 –

+0

ああ、私はあなたの質問を誤解していました、私の論理はあなたのものとまったく反対でした。ルートファイルをもう少し投稿して、キャッチオールがどのようにそこに収まるかを確認できますか? –

+0

さて、上記の質問に現在のルートを追加しました。 –

0

それはラムダを取っています。あなたはどんな基準を使ってもかまいません。

class MyConstraint 
    BYPASSED_ROUTES = ['users', 'my-stuff'] 

    def matches?(request) 
    BYPASSED_ROUTES.map {|r| request.path.include?(r)} .empty? 
    end 
end 

TwitterClone::Application.routes.draw do 
    match "*path" => "router#routing", :constraints => MyConstraint.new 
end 

この例では、rails routing guideから構成されている:あなたがしようとする複数のルートを持っていたら、あなたはクリーンな何かをしたい場合は

関連する問題