Rails:路线?

时间:2012-12-14 20:33:43

标签: ruby-on-rails

我正在阅读The Rails 3 Way,我不明白为什么路线上会有一个触发器。我仍然很难掌握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

2 个答案:

答案 0 :(得分:2)

也许你对JavaScript更熟悉? Proc类似于匿名函数。代码的第一个版本大致相当于:

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

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

第二个版本就像写

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

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

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

答案 1 :(得分:0)

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

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