5

Rails 3でキャッチオールルートを書き込もうとしていますが、いくつかの用語を予約したいと思います。私は、この投稿で提示された例、David Burrowsによる回答:Rails3を使用した動的ルートを具体的にフォローしています。

私が使用している構文は次のとおりです。

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

これで、その構文は問題なく機能します。ユーザーがパスに「user」または「my-stuff」を含むページにアクセスすると、キャッチオールを通過して特定の場所に移動します。ユーザーが他のURLにアクセスすると、ルーティングロジックに移動します。

私の質問は読みやすさに関するものです-ルートを正規表現以外のものと照合する方法はありますか?照合する用語の配列を提供する方法はありますか?また、全体ではなく、ルートの特定のセグメントを一致させる方法はありますか?

明らかに、Railsにはルーティングが組み込まれていますが、このプロジェクトには、特定のルートについて、コントローラーがURLに存在しないという要件があります。したがって、キャッチオール。

助けてくれてありがとう

以下の回答ごとに更新されたルートファイルは次のとおりです。

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
4

2 に答える 2

6

複数のルートを試してみて、よりクリーンなものが必要な場合は、クラスを使用して制約を指定できます。

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

この例は、レールルーティングガイドを基にしています。

于 2011-10-07T13:55:38.710 に答える
0

それはラムダを取っています。必要な基準を使用できます。

于 2011-10-07T13:39:11.953 に答える