0

The Rails 3 Wayを読んでいますが、ルートにprocがある理由がわかりません。私はまだproc/lambdaの使用法とそれらがどのように使用されているかを理解するのに苦労しています。

これはどのように:

match 'records/:id' => "records#protected",
  :constraints => proc {|req| req.params[:id].to_i < 100 }

と違う:

match 'records/:id' => "records#protected",
  :constraints => params[:id].to_i < 100

4

2 に答える 2

2

たぶんあなたはJavaScriptに精通していますか?Procは無名関数に似ています。コードの最初のバージョンは、おおよそ次のものと同等です。

{ constraints: function(req) { return req.params["id"] < 100 }}

つまりconstraints、後で評価できるコードのブロックに設定されています。

2番目のバージョンは書くようなものになります

{ constraints: return req.params["id"] < 100 }

つまり、構文エラーでありreturn req.params["id"] < 100、コードが解釈されるとすぐに評価しようとするため、req定義される前に論理的に壊れています。

これが2つのバージョンの主な違いであり、proc重要な理由です。後でルーティングが発生したときに評価できるように、コードをルートに渡す必要があります。

于 2012-12-14T20:36:38.397 に答える
0

ルートにProcを提供することにより、ルートマッチングを動的に制約できます。ルートが一致するかどうかを判断できる任意のコードを実行できます。

あなたの例でidは、100未満を通過するリクエストにのみそのルートを一致させたいと考えています。その制約を表現するためのより良い方法は実際にはありません。Procが本当に最良の選択です。

于 2012-12-14T20:36:50.923 に答える