Rails 为route的路由约束提供了constraints 方法,具体的使用如下:
- 限制IP地址
可以提供一个ip或者一个ip地址的范围进行限制,一旦检测到用户的ip地址符合限制范围,则会告知不存在此route。constraints(:ip => /192.168.\d+.\d+/) do resources :posts end
- 匹配动态请求
这个例子是控制route只能被iPhone访问。
1,第一种做法,传递block,如下:
通过传入一个block的方式来匹配HTTP_USER_AGENT是否匹配iPhone,如果是true则可以访问iphones这个资源路径。constraints(lambda { |req| req.env["HTTP_USER_AGENT"] =~ /iPhone/ }) do resources :iphones end
但是第一方法比较粗暴,代码不够整洁,如果逻辑复杂,就显得啰嗦,所以可以选择第二种方法
2,第二种做法,传递一个Class,并且在这Class必须实现matches? 方法。
我们事先在ib/constraints 定义一个Iphone Class:class Iphone def self.matches?(request) request.env["HTTP_USER_AGENT"] =~ /iPhone/ end end
接着在把第一方法的代码修改为:
这样我们就可以把逻辑全部放在Iphone了constraints(Iphone) do resources :iphones end
参考资料:
例子实现: https://gist.github.com/bsodmike/1369419
Rails Guide: http://guides.rubyonrails.org/routing.html#segment-constraints
同时如果你觉得在本文中介绍太简单,可以移步官方源码实现,并且附带有此api的详细guides: