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?Procs 类似于匿名函数。您的代码的第一个版本大致相当于:

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

也就是说,constraints被设置为可以在以后评估的代码块。

第二个版本就像写

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

也就是说,语法错误,并且return req.params["id"] < 100在解释代码时尝试立即评估时逻辑上被破坏,req甚至在定义之前。

这是两个版本之间的主要区别,proc也是重要的原因:您需要将代码传递到路由中,以便稍后在路由发生时对其进行评估。

于 2012-12-14T20:36:38.397 回答
0

通过为路由提供 Proc,您可以动态约束路由匹配。它允许您执行可以确定路由是否应该匹配的任意代码。

在您的示例中,您只希望该路由匹配通过id小于 100 的请求。确实没有更好的方法来表达该约束 - Proc 确实是最佳选择。

于 2012-12-14T20:36:50.923 回答