我正在阅读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
?
答案 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真的是最佳选择